#include <bits/stdc++.h>   using namespace std;   template <class S, class T>   ostream& operator<<(ostream& o, const pair<S, T>& p) {     return o <<  (  << p.first <<  ,  << p.second <<  ) ;   }   template <class T>   ostream& operator<<(ostream& o, const vector<T>& vc) {     o <<  { ;     for (const T& v : vc) o << v <<  , ;     o <<  } ;     return o;   }   using ll = long long;   template <class T>   using V = vector<T>;   template <class T>   using VV = vector<vector<T>>;   constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }   template <unsigned int mod_>   struct ModInt {     using uint = unsigned int;     using ll = long long;     using ull = unsigned long long;     constexpr static uint mod = mod_;     uint v;     ModInt() : v(0) {}     ModInt(ll _v) : v(normS(_v % mod + mod)) {}     explicit operator bool() const { return v != 0; }     static uint normS(const uint& x) { return (x < mod) ? x : x - mod; }     static ModInt make(const uint& x) {       ModInt m;       m.v = x;       return m;     }     ModInt operator+(const ModInt& b) const { return make(normS(v + b.v)); }     ModInt operator-(const ModInt& b) const { return make(normS(v + mod - b.v)); }     ModInt operator-() const { return make(normS(mod - v)); }     ModInt operator*(const ModInt& b) const { return make((ull)v * b.v % mod); }     ModInt operator/(const ModInt& b) const { return *this * b.inv(); }     ModInt& operator+=(const ModInt& b) { return *this = *this + b; }     ModInt& operator-=(const ModInt& b) { return *this = *this - b; }     ModInt& operator*=(const ModInt& b) { return *this = *this * b; }     ModInt& operator/=(const ModInt& b) { return *this = *this / b; }     ModInt& operator++(int) { return *this = *this + 1; }     ModInt& operator--(int) { return *this = *this - 1; }     ll extgcd(ll a, ll b, ll& x, ll& y) const {       ll p[] = {a, 1, 0}, q[] = {b, 0, 1};       while (*q) {         ll t = *p / *q;         for (int i = 0; i < (int)(3); i++) swap(p[i] -= t * q[i], q[i]);       }       if (p[0] < 0)         for (int i = 0; i < (int)(3); i++) p[i] = -p[i];       x = p[1], y = p[2];       return p[0];     }     ModInt inv() const {       ll x, y;       extgcd(v, mod, x, y);       return make(normS(x + mod));     }     ModInt pow(ll p) const {       if (p < 0) return inv().pow(-p);       ModInt a = 1;       ModInt x = *this;       while (p) {         if (p & 1) a *= x;         x *= x;         p >>= 1;       }       return a;     }     bool operator==(const ModInt& b) const { return v == b.v; }     bool operator!=(const ModInt& b) const { return v != b.v; }     friend istream& operator>>(istream& o, ModInt& x) {       ll tmp;       o >> tmp;       x = ModInt(tmp);       return o;     }     friend ostream& operator<<(ostream& o, const ModInt& x) { return o << x.v; }   };   using mint = ModInt<1000000007>;   int main() {     cin.tie(0);     ios::sync_with_stdio(false);     cout << fixed << setprecision(20);     int N, Q;     cin >> N >> Q;     V<ll> A(N);     for (int i = 0; i < (int)(N); i++) cin >> A[i];     V<mint> p2(N + 1);     p2[0] = 1;     for (int i = 1; i <= (int)(N); i++) p2[i] = p2[i - 1] * 2;     struct link {       int to;       mint sum;       ll sum2;     };     V<link> ls(N);     const ll inf = 1e9;     for (int i = 0; i < (int)(N); i++) {       link cur{i, A[i], A[i]};       while (cur.to > 0 && cur.sum2 > 0) {         link x = ls[cur.to - 1];         link nxt;         nxt.to = x.to;         nxt.sum = cur.sum * p2[cur.to - x.to] + x.sum;         nxt.sum2 = (cur.sum2 << min(cur.to - x.to, 30)) + x.sum2;         nxt.sum2 = min(nxt.sum2, inf);         cur = nxt;       }       ls[i] = cur;     }     const int H = 20;     V<array<pair<int, mint>, H>> par(N + 1);     for (int h = 0; h < (int)(H); h++) par[0][h] = {-1, 0};     for (int i = 0; i < (int)(N); i++) {       par[i + 1][0] = {ls[i].to, ls[i].sum};       for (int h = 1; h <= (int)(H - 1); h++) {         int j;         mint js;         tie(j, js) = par[i + 1][h - 1];         if (j == -1) {           par[i + 1][h] = {-1, 0};         } else {           int k;           mint ks;           tie(k, ks) = par[j][h - 1];           if (k == -1)             par[i + 1][h] = {-1, 0};           else             par[i + 1][h] = {k, js + ks};         }       }     }     V<mint> sum(N + 1);     for (int i = N - 1; i >= 0; i--) sum[i] = sum[i + 1] * 2 + A[i];     for (int _ = 0; _ < (int)(Q); _++) {       int l, r;       cin >> l >> r;       l--;       mint ans = 0;       for (int h = H - 1; h >= 0; h--) {         if (l + 1 <= par[r][h].first) {           ans += par[r][h].second;           r = par[r][h].first;         }       }       ans *= 2;       ans += sum[l] - sum[r] * p2[r - l];       cout << ans << endl;     }   }