#include <bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ALL(a) a.begin(), a.end()
#define REP(i, n) for(int i = 0; i < n; ++ i)
#define FOR(i, a, b) for(int i = a; i <= b; ++ i)
#define FORD(i, a, b) for(int i = a; i >= b; -- i)
const int N = 5e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const long long LINF = 1e18;
ll a[N], pw[N];
ll st[N][2];
int n, q;
ll sub(ll a, ll b)
{
return (a % MOD - b % MOD + MOD) % MOD;
}
ll add(ll a, ll b)
{
return (a % MOD + b % MOD) % MOD;
}
ll mul(ll a, ll b)
{
return ((a % MOD) * (b % MOD)) % MOD;
}
void update(int pos, int val, int k, int id = 1, int l = 1, int r = n)
{
if(pos < l || r < pos) return;
if(l == r)
{
st[id][k] = val;
return;
}
int m = l + r >> 1;
update(pos, val, k, id << 1, l, m);
update(pos, val, k, id << 1 | 1, m + 1, r);
st[id][k] = add(st[id << 1][k], st[id << 1 | 1][k]);
}
int get(int lef, int rig, int k, int id = 1, int l = 1, int r = n)
{
if(lef > r || rig < l) return 0;
if(lef <= l && r <= rig) return st[id][k];
int m = (l + r) >> 1;
return add(get(lef, rig, k, id << 1, l, m), get(lef, rig, k, id << 1 | 1, m + 1, r));
}
void solve()
{
cin >> n >> q;
FOR(i, 1, n) cin >> a[i];
pw[0] = 1;
FOR(i, 1, n) pw[i] = pw[i - 1] * 2 % MOD;
FOR(i, 1, n) update(i, mul(a[i], a[i]), 0);
FOR(i, 2, n) update(i, mul(a[i], a[i - 1]), 1);
while(q--)
{
int t, u, v;
cin >> t >> u >> v;
if(t == 1)
{
update(u, mul(v, v), 0);
a[u] = v;
if(u + 1 <= n) update(u + 1, mul(a[u + 1], v), 1);
if(u - 1 >= 1) update(u, mul(a[u - 1], v), 1);
}
else
{
ll x = get(u, v, 0), y = get(u + 1, v, 1);
cout << mul(pw[v - u], sub(x, y)) << "\n";
}
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Mgc2Vjb25kCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgQUxMKGEpIGEuYmVnaW4oKSwgYS5lbmQoKQojZGVmaW5lIFJFUChpLCBuKSBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKysgaSkKI2RlZmluZSBGT1IoaSwgYSwgYikgZm9yKGludCBpID0gYTsgaSA8PSBiOyArKyBpKQojZGVmaW5lIEZPUkQoaSwgYSwgYikgZm9yKGludCBpID0gYTsgaSA+PSBiOyAtLSBpKQoKY29uc3QgaW50IE4gPSAgNWU1ICsgNTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBJTkYgPSAxZTk7CmNvbnN0IGxvbmcgbG9uZyBMSU5GID0gMWUxODsKCmxsIGFbTl0sIHB3W05dOwoKbGwgc3RbTl1bMl07CgppbnQgbiwgcTsKCmxsIHN1YihsbCBhLCBsbCBiKQp7CiAgICByZXR1cm4gKGEgJSBNT0QgLSBiICUgTU9EICsgTU9EKSAlIE1PRDsKfQoKbGwgYWRkKGxsIGEsIGxsIGIpCnsKICAgIHJldHVybiAoYSAlIE1PRCArIGIgJSBNT0QpICUgTU9EOwp9CgpsbCBtdWwobGwgYSwgbGwgYikKewogICAgcmV0dXJuICgoYSAlIE1PRCkgKiAoYiAlIE1PRCkpICUgTU9EOwp9CgoKdm9pZCB1cGRhdGUoaW50IHBvcywgaW50IHZhbCwgaW50IGssIGludCBpZCA9IDEsIGludCBsID0gMSwgaW50IHIgPSBuKQp7CiAgICBpZihwb3MgPCBsIHx8IHIgPCBwb3MpIHJldHVybjsKICAgIGlmKGwgPT0gcikKICAgIHsKICAgICAgICBzdFtpZF1ba10gPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG0gPSBsICsgciA+PiAxOwogICAgdXBkYXRlKHBvcywgdmFsLCBrLCBpZCA8PCAxLCBsLCBtKTsKICAgIHVwZGF0ZShwb3MsIHZhbCwgaywgaWQgPDwgMSB8IDEsIG0gKyAxLCByKTsKICAgIHN0W2lkXVtrXSA9IGFkZChzdFtpZCA8PCAxXVtrXSwgc3RbaWQgPDwgMSB8IDFdW2tdKTsKfQoKaW50IGdldChpbnQgbGVmLCBpbnQgcmlnLCBpbnQgaywgaW50IGlkID0gMSwgaW50IGwgPSAxLCBpbnQgciA9IG4pCnsKICAgIGlmKGxlZiA+IHIgfHwgcmlnIDwgbCkgcmV0dXJuIDA7CiAgICBpZihsZWYgPD0gbCAmJiByIDw9IHJpZykgcmV0dXJuIHN0W2lkXVtrXTsKICAgIGludCBtID0gKGwgKyByKSA+PiAxOwogICAgcmV0dXJuIGFkZChnZXQobGVmLCByaWcsIGssIGlkIDw8IDEsIGwsIG0pLCBnZXQobGVmLCByaWcsIGssIGlkIDw8IDEgfCAxLCBtICsgMSwgcikpOwp9Cgp2b2lkIHNvbHZlKCkKewogICAgY2luID4+IG4gPj4gcTsKICAgIEZPUihpLCAxLCBuKSBjaW4gPj4gYVtpXTsKICAgIHB3WzBdID0gMTsKICAgIEZPUihpLCAxLCBuKSBwd1tpXSA9IHB3W2kgLSAxXSAqIDIgJSBNT0Q7CiAgICBGT1IoaSwgMSwgbikgdXBkYXRlKGksIG11bChhW2ldLCBhW2ldKSwgMCk7CiAgICBGT1IoaSwgMiwgbikgdXBkYXRlKGksIG11bChhW2ldLCBhW2kgLSAxXSksIDEpOwogICAgd2hpbGUocS0tKQogICAgewogICAgICAgIGludCB0LCB1LCB2OwogICAgICAgIGNpbiA+PiB0ID4+IHUgPj4gdjsKICAgICAgICBpZih0ID09IDEpCiAgICAgICAgewogICAgICAgICAgICB1cGRhdGUodSwgbXVsKHYsIHYpLCAwKTsKICAgICAgICAgICAgYVt1XSA9IHY7CiAgICAgICAgICAgIGlmKHUgKyAxIDw9IG4pIHVwZGF0ZSh1ICsgMSwgbXVsKGFbdSArIDFdLCB2KSwgMSk7CiAgICAgICAgICAgIGlmKHUgLSAxID49IDEpIHVwZGF0ZSh1LCBtdWwoYVt1IC0gMV0sIHYpLCAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbGwgeCA9IGdldCh1LCB2LCAwKSwgeSA9IGdldCh1ICsgMSwgdiwgMSk7CiAgICAgICAgICAgIGNvdXQgPDwgbXVsKHB3W3YgLSB1XSwgc3ViKHgsIHkpKSA8PCAiXG4iOwogICAgICAgIH0KICAgIH0KCn0KCnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgCiAgICBjaW4udGllKDApOyAgICAgIGNvdXQudGllKDApOwogIAogICAgc29sdmUoKTsKICAgIHJldHVybiAwOwp9Cgo=