text: //{
  #include<bits/stdc++.h>
  using namespace std;
  typedef long long ll;
  typedef double lf;
  typedef pair<ll,ll> ii;
  #define REP(i,n) for(ll i=0;i<n;i++)
  #define REP1(i,n) for(ll i=1;i<=n;i++)
  #define FILL(i,n) memset(i,n,sizeof i)
  #define X first
  #define Y second
  #define SZ(_a) (int)_a.size()
  #define ALL(_a) _a.begin(),_a.end()
  #define pb push_back
  #ifdef brian
  #define debug(...) do{\
      fprintf(stderr,"%s - %d (%s) = ",__PRETTY_FUNCTION__,__LINE__,#__VA_ARGS__);\
      _do(__VA_ARGS__);\
  }while(0)
  template<typename T>void _do(T &&_x){cerr<<_x<<endl;}
  template<typename T,typename ...S> void _do(T &&_x,S &&..._t){cerr<<_x<<" ,";_do(_t...);}
  template<typename _a,typename _b> ostream& operator << (ostream &_s,const pair<_a,_b> &_p){return _s<<"("<<_p.X<<","<<_p.Y<<")";}
  template<typename It> ostream& _OUTC(ostream &_s,It _ita,It _itb)
  {
      _s<<"{";
      for(It _it=_ita;_it!=_itb;_it++)
      {
          _s<<(_it==_ita?"":",")<<*_it;
      }
      _s<<"}";
      return _s;
  }
  template<typename _a> ostream &operator << (ostream &_s,vector<_a> &_c){return _OUTC(_s,ALL(_c));}
  template<typename _a> ostream &operator << (ostream &_s,set<_a> &_c){return _OUTC(_s,ALL(_c));}
  template<typename _a,typename _b> ostream &operator << (ostream &_s,map<_a,_b> &_c){return _OUTC(_s,ALL(_c));}
  template<typename _t> void pary(_t _a,_t _b){_OUTC(cerr,_a,_b);cerr<<endl;}
  #define IOS()
  #else
  #define debug(...)
  #define pary(...)
  #define endl '\n'
  #define IOS() ios_base::sync_with_stdio(0);cin.tie(0);
  #endif // brian
  //}
  
  
  const ll MAXn=4e5+5,MAXlg=__lg(MAXn)+2;
  const ll MOD=1000000007;
  const ll INF=ll(1e15);
  
  
  ll K,n,q,tt=0;
  vector<ll> uni;
  
  ll d[MAXn],ct[MAXn],ans[MAXn],dt[MAXn],qrl[MAXn],qrr[MAXn],sq[MAXn];
  ii rk[MAXn];
  ll l=0,r=0;
  
  void add(ll t)
  {
    if(ct[t]>=0)tt=(tt+uni[t]*(sq[ct[t]+1]-sq[ct[t]]))%MOD;
    if(tt<0)tt+=MOD;
    ct[t]++;
    debug(t,tt);
  }
  void sub(ll t)
  {
    if(ct[t]>=1)tt=(tt+uni[t]*(sq[ct[t]-1]-sq[ct[t]]))%MOD;
    if(tt<0)tt+=MOD;
    ct[t]--;
    debug(t,tt);
  }
  
  int main()
  {
      IOS();
      cin>>n>>q;
      K=max(1.1,n/sqrt(q+0.5));
      REP(i,n)cin>>d[i],uni.pb(d[i]);
      sort(ALL(uni));
      uni.resize(unique(ALL(uni))-uni.begin());
      REP(i,n)d[i]=lower_bound(ALL(uni),d[i])-uni.begin();
  
      REP(i,q)cin>>qrl[i]>>qrr[i],dt[i]=i;
      REP(i,q)
      {
        ll t=qrl[i]/K;
        rk[i]=ii(t,((t&1)?-1:1)*qrr[i]);
      }
      sort(dt,dt+q,[](int a,int b){return rk[a]<rk[b];});
  
      REP(i,n+1)sq[i]=(i*i)%MOD;
  
      debug(uni,K);
      pary(dt,dt+q);
      pary(sq,sq+n+1);
      REP(i,q)
      {
        ll t=dt[i];
        debug(t,qrl[t],qrr[t]);
        while(l<qrl[t])sub(d[l++]);
        while(l>qrl[t])add(d[--l]);
        while(r<qrr[t])add(d[r++]);
        while(r>qrr[t])sub(d[--r]);
        ans[t]=tt;
      }
      REP(i,q)cout<<ans[i]<<endl;
  
  }
  