#include<bits/stdc++.h>
#define int long long
#define lc (p<<1)
#define rc (p<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e5+5;
int n, m, op, x, y;
int a[N], s1[N<<2], s2[N<<2], t[N<<2];
int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
void pushup(int p){
s1[p] = (s1[lc] + s1[rc]) % mod;
s2[p] = (s2[lc] + s2[rc]) % mod;
}
void build(int p, int l, int r){
if(l == r) return s1[p] = a[l], s2[p] = a[l] * a[l] % mod, void();
build(lc, l, mid), build(rc, mid + 1, r);
pushup(p);
}
void cal(int p, int l, int r, int x){
int len = r - l + 1;
s2[p] = (s2[p] + len * x % mod * x % mod + 2 * x % mod * s1[p] % mod) % mod;
s1[p] = (s1[p] + len * x % mod) % mod;
t[p] = (t[p] + x) % mod;
}
void pushdown(int p, int l, int r){
if(t[p] != 0){
cal(lc, l, mid, t[p]);
cal(rc, mid + 1, r, t[p]);
t[p] = 0;
}
}
void add(int p, int l, int r, int L, int R, int x){
if(r < L || R < l) return;
if(L <= l && r <= R) return cal(p, l, r, x);
pushdown(p, l, r);
add(lc, l, mid, L, R, x), add(rc, mid + 1, r, L, R, x);
pushup(p);
}
int query(int p, int l, int r, int L, int R, int *arr){
if(r < L || R < l) return 0;
if(L <= l && r <= R) return arr[p];
pushdown(p, l, r);
return (query(lc, l, mid, L, R, arr) + query(rc, mid + 1, r, L, R, arr)) % mod;
}
signed main() {
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
build(1, 1, n);
while(m--){
cin >> op >> x >> y;
if(op == 1){
add(1, 1, n, x, x, y - a[x]);
a[x] = y;
}
if(op == 2){
int inv = qpow(y - x + 1, mod - 2);
int tmp = query(1, 1, n, x, y, s1) * inv % mod;
int ans = (query(1, 1, n, x, y, s2) * inv % mod - tmp * tmp % mod + mod) % mod;
cout << ans << endl;
}
}
return 0;
}
50pts,输出负数,感觉取模问题