#include <bits/stdc++.h>
#define pb push_back
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define si short int
#define speed ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pill pair<ll,ll>
#define f first
#define s second
#define pilc pair<ll,char>
#define all(a) (a).begin(),(a).end()
#define rep(s,e,step) for(int i = (s); i < (e) ; i += step)
#define vrep(s,e,step) for(int j = (s); j < (e) ; j += step)
#define ex exit(0) 
#define triple pair<pill, ll>
#define pinode pair<node*, node*>
#define quadra pair<pill, pill>
#define ld double
#define pild pair<double,double>
using namespace std;
 
const ll N = 1e5 + 11;
const ll M = 32;
const ll block = 500;
const ll mod = 1e9 + 7;
 
mt19937_64 bruh(chrono::steady_clock::now().time_since_epoch().count());
 
int n, q, a[N], b[N], ad[2][N], c[2][N];
int l[N], r[N], pref[N];
int L, R;
vector<int> szh;

struct Query {
	int l, r, idx;
	int64_t ord;
 
	inline void calcOrder() {
		ord = 0;
	}
};
 
inline bool operator<(const Query &a, const Query &b) {
	if(a.l/block != b.l/block)
	    return a.l < b.l;
    return a.r < b.r;
}

vector<pair<pair<int, int>, int>> chg[N], del[N], del2[N];
vector<int> scandel[N], scandel2[N], scanchg[N];

ll delta[N], answ[N];

int main() {                                                       
	speed;
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
        cin >> a[i], szh.pb(a[i]), pref[i] = (pref[i - 1] + a[i]) % mod;
    sort(szh.begin(), szh.end());
    szh.erase(unique(szh.begin(), szh.end()), szh.end());
    for(int i = 1; i <= n; i++)
        b[i] = lower_bound(szh.begin(), szh.end(), a[i]) - szh.begin();
    vector<Query> Q(q);
    for(int i = 1; i <= q; i++) {
        cin >> l[i] >> r[i];
        Q[i - 1].l = l[i];
        Q[i - 1].r = r[i];
        Q[i - 1].idx = i;
        Q[i - 1].calcOrder();
    }
    sort(Q.begin(), Q.end());
    ll L = 1, R = 1;
    for(auto v : Q) {
        int u = v.idx;
        if(R < r[u]) {
            del2[L - 1].pb(mp(mp(R + 1, r[u]), u));
            scanchg[R].pb(u);//+1
            scanchg[r[u]].pb(-u);
        } else if(R > r[u]) {
            chg[L - 1].pb(mp(mp(r[u] + 1, R), u));
            scandel[r[u] + 1].pb(u);
            scandel[R + 1].pb(-u);
        }
        R = r[u];
        if(L > l[u]) {
            chg[R].pb(mp(mp(l[u], L - 1), u));
            scandel2[l[u]].pb(u);
            scandel2[L].pb(-u);
        }
        else if(L < l[u]){
            del[R].pb(mp(mp(L, l[u] - 1), u));
            scanchg[max(1ll, L - 1)].pb(u);
            scanchg[l[u] - 1].pb(-u);
        }
        L = l[u];
    }
    
    multiset<int> ch, de, d2;
    
    for(int i = 1; i <= n; i++) {
        for(int j = b[i]/block - 1; j >= 0; j--)
            ad[0][j]++, ad[1][j] = (ad[1][j] + a[i]) % mod;
        int L = ((ll)(b[i]/block)) * block;
        for(int j = b[i]; j >= L; j--)
            c[0][j]++, c[1][j] = (c[1][j] + a[i]) % mod;
        for(auto u : scanchg[i]) {
            if(u < 0)ch.erase(ch.find(-u));
            else ch.insert(u);
        }    
        for(auto u : scandel2[i]) {
            if(u < 0)d2.erase(d2.find(-u));
            else d2.insert(u);
        }  
        for(auto u : scandel[i]) {
            if(u < 0)de.erase(de.find(-u));
            else de.insert(u);
        }      
        for(auto u : ch) {
            int zn = b[i + 1];
            delta[u] = (delta[u] + ad[1][zn/block] + c[1][zn]) % mod;
            delta[u] = (delta[u] + a[i + 1] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod) % mod;
        }
        for(auto u : de) {
            for(int j = i; j <= i; j++) {
                int zn = b[j];
                delta[u] = (delta[u] - ((ad[1][zn/block] + c[1][zn] - a[j] + mod) % mod) + mod) %  mod;
                delta[u] = (delta[u] - a[j] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod + mod) % mod;
            }
        }
        for(auto u : d2) {
            for(int j = i; j <= i; j++) {
                int zn = b[j];
                delta[u] = (delta[u] - ((ad[1][zn/block] + c[1][zn] + mod) % mod) + mod) %  mod;
                delta[u] = (delta[u] - a[j] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod + mod) % mod;
            }
        }
        for(auto u : chg[i]) {
            for(int j = u.f.f; j <= u.f.s; j++) {
                int zn = b[j];
                delta[u.s] = (delta[u.s] + ad[1][zn/block] + c[1][zn]) % mod;
                delta[u.s] = (delta[u.s] + a[j] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod) % mod;
            }
        }
        for(auto u : del[i]) {
            for(int j = u.f.f; j <= u.f.s; j++) {
                int zn = b[j];
                ll z = delta[u.s];
                delta[u.s] = (delta[u.s] - ((ad[1][zn/block] + c[1][zn] - a[j] + mod) % mod) + mod) %  mod;
                delta[u.s] = (delta[u.s] - a[j] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod + mod) % mod;
            }
        }
        for(auto u : del2[i]) {
            for(int j = u.f.f; j <= u.f.s; j++) {
                int zn = b[j];
                ll z = delta[u.s];
                delta[u.s] = (delta[u.s] - ((ad[1][zn/block] + c[1][zn] + mod) % mod) + mod) %  mod;
                delta[u.s] = (delta[u.s] - a[j] * 1ll * ((ad[0][0] + c[0][0]) - (ad[0][zn/block] + c[0][zn])) % mod + mod) % mod;
            }
        }
    }
    ll ans = 0;
    ll sum2 = 0;
    for(auto v : Q) {
        int u = v.idx;
        ll sum = (pref[r[u]] - pref[l[u] - 1] + mod) % mod;
        sum2 = (sum2 + delta[u]) % mod;
        ll sz = r[u] - l[u];
        answ[u] = (6 * sum2 % mod * (sz + 1ll) % mod);
        answ[u] = answ[u] - (3 * sum % mod * sz % mod * (sz + 1ll) % mod) + mod;
        answ[u] = answ[u] % mod;
    }
    for(int i = 1; i <= q; i++)
        cout << answ[i] << '\n';
}
