#include<bits/stdc++.h>
using namespace std;
template<typename X, typename Y>
bool chmax(X& a, Y b) { return (a < b) ? a = b, 1 : 0; }
template<typename X, typename Y>
bool chmin(X& a, Y b) { return (a > b) ? a = b, 1 : 0; }
using ll = long long;
const int MOD = 1e9+7;
const int INV2 = (MOD + 1) / 2;
const int N = 2e5+5;
struct Query {
int type, x, y;
} qs[N];
int n, q;
ll a[N];
namespace Subtask1 {
bool check() {
return n <= 200 && q <= 200;
}
void solve() {
for (int i = 0; i < q; i++) {
if (qs[i].type == 1) {
int k = qs[i].x, x = qs[i].y;
a[k] = x;
} else {
int l = qs[i].x, r = qs[i].y;
ll ans = 0;
for (int i = l; i <= r; i++)
for (int j = i + 1; j <= r; j++)
ans = (ans + a[i] * a[j] % MOD) % MOD;
cout << ans << '\n';
}
}
}
}
namespace Subtask2 {
ll P[N], P2[N];
bool check() {
for (int i = 0; i < q; i++)
if (qs[i].type == 1) return false;
return true;
}
void solve() {
for (int i = 1; i <= n; i++) {
P[i] = P[i - 1] + a[i];
P2[i] = P2[i - 1] + (a[i] * a[i]);
}
for (int i = 0; i < q; i++) {
int l = qs[i].x, r = qs[i].y;
ll S1 = (P[r] - P[l - 1] + MOD) % MOD, S2 = (P2[r] - P2[l - 1] + MOD) % MOD;
cout << (S1 * S1 % MOD - S2 + MOD) % MOD * INV2 % MOD << '\n';
}
}
}
namespace Fulltask {
void solve() {
}
}
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 0; i < q; i++) {
int type, x, y; cin >> type >> x >> y;
qs[i] = {type, x, y};
}
if (Subtask1::check()) Subtask1::solve();
else if (Subtask2::check()) Subtask2::solve();
else Fulltask::solve();
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
#define TASK "STSYS"
if (fopen(TASK".INP", "r")) {
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
int tests = 1; // cin >> tests;
while (tests--) solve();
#ifdef LOCAL
cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFk+CmJvb2wgY2htYXgoWCYgYSwgWSBiKSB7IHJldHVybiAoYSA8IGIpID8gYSA9IGIsIDEgOiAwOyB9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgpib29sIGNobWluKFgmIGEsIFkgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgPSBiLCAxIDogMDsgfQoKdXNpbmcgbGwgPSBsb25nIGxvbmc7Cgpjb25zdCBpbnQgTU9EID0gMWU5Kzc7CmNvbnN0IGludCBJTlYyID0gKE1PRCArIDEpIC8gMjsKY29uc3QgaW50IE4gPSAyZTUrNTsKCnN0cnVjdCBRdWVyeSB7CiAgICBpbnQgdHlwZSwgeCwgeTsKfSBxc1tOXTsKCmludCBuLCBxOwpsbCBhW05dOwoKbmFtZXNwYWNlIFN1YnRhc2sxIHsKICAgIGJvb2wgY2hlY2soKSB7CiAgICAgICAgcmV0dXJuIG4gPD0gMjAwICYmIHEgPD0gMjAwOwogICAgfQogICAgdm9pZCBzb2x2ZSgpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgewogICAgICAgICAgICBpZiAocXNbaV0udHlwZSA9PSAxKSB7CiAgICAgICAgICAgICAgICBpbnQgayA9IHFzW2ldLngsIHggPSBxc1tpXS55OwogICAgICAgICAgICAgICAgYVtrXSA9IHg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnQgbCA9IHFzW2ldLngsIHIgPSBxc1tpXS55OwogICAgICAgICAgICAgICAgbGwgYW5zID0gMDsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsOyBpIDw9IHI7IGkrKykKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPD0gcjsgaisrKQogICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSAoYW5zICsgYVtpXSAqIGFbal0gJSBNT0QpICUgTU9EOwogICAgICAgICAgICAgICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKbmFtZXNwYWNlIFN1YnRhc2syIHsKICAgIGxsIFBbTl0sIFAyW05dOwogICAgYm9vbCBjaGVjaygpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykKICAgICAgICAgICAgaWYgKHFzW2ldLnR5cGUgPT0gMSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdm9pZCBzb2x2ZSgpIHsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgUFtpXSA9IFBbaSAtIDFdICsgYVtpXTsKICAgICAgICAgICAgUDJbaV0gPSBQMltpIC0gMV0gKyAoYVtpXSAqIGFbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgewogICAgICAgICAgICBpbnQgbCA9IHFzW2ldLngsIHIgPSBxc1tpXS55OwogICAgICAgICAgICBsbCBTMSA9IChQW3JdIC0gUFtsIC0gMV0gKyBNT0QpICUgTU9ELCBTMiA9IChQMltyXSAtIFAyW2wgLSAxXSArIE1PRCkgJSBNT0Q7CiAgICAgICAgICAgIGNvdXQgPDwgKFMxICogUzEgJSBNT0QgLSBTMiArIE1PRCkgJSBNT0QgKiBJTlYyICUgTU9EIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9CgpuYW1lc3BhY2UgRnVsbHRhc2sgewogICAgdm9pZCBzb2x2ZSgpIHsKCiAgICB9Cn0KCnZvaWQgc29sdmUoKSB7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcTsgaSsrKSB7CiAgICAgICAgaW50IHR5cGUsIHgsIHk7IGNpbiA+PiB0eXBlID4+IHggPj4geTsKICAgICAgICBxc1tpXSA9IHt0eXBlLCB4LCB5fTsKICAgIH0KICAgIGlmIChTdWJ0YXNrMTo6Y2hlY2soKSkgU3VidGFzazE6OnNvbHZlKCk7CiAgICBlbHNlIGlmIChTdWJ0YXNrMjo6Y2hlY2soKSkgU3VidGFzazI6OnNvbHZlKCk7CiAgICBlbHNlIEZ1bGx0YXNrOjpzb2x2ZSgpOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOwoKICAgICNkZWZpbmUgVEFTSyAiU1RTWVMiCiAgICBpZiAoZm9wZW4oVEFTSyIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4oVEFTSyIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihUQVNLIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgaW50IHRlc3RzID0gMTsgLy8gY2luID4+IHRlc3RzOwogICAgd2hpbGUgKHRlc3RzLS0pIHNvbHZlKCk7CgogICAgI2lmZGVmIExPQ0FMCiAgICBjZXJyIDw8ICJcblRpbWUgZWxhcHNlZDogIiA8PCAxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIiBzLlxuIjsKICAgICNlbmRpZgogICAgcmV0dXJuIDA7Cn0K