代码如下:
#include <bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define sqr(a) (a*a%mod)
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
ll n, m;
struct Seg {
ll l, r, sum, psum;
}tr[maxn<<2];
ll qpow(int a) {
ll ans = 1, base = a;
ll x = mod-2;
while(x) {
if(x & 1) ans = (ans * base) % mod;
base = (base*base)%mod; x >>= 1;
}
return ans;
}
ll a[maxn];
void pushup(int p) {
tr[p].psum = (tr[ls].psum + tr[rs].psum)%mod;
tr[p].sum = (tr[ls].sum + tr[rs].sum)%mod;
}
void build(int p, int l, int r) {
tr[p].l = l, tr[p].r = r;
if(l == r) {
tr[p].psum = sqr(a[l]);
tr[p].sum = a[l];
return ;
}
int mid = (l+r)/2;
build(ls, l, mid);
build(rs, mid+1, r);
pushup(p);
}
void update(int p, int x, ll k) {
if(tr[p].l == x && tr[p].r == x) {
tr[p].sum = k;
tr[p].psum = sqr(k);
return ;
}
int mid = (tr[p].l + tr[p].r)/2;
if(x <= mid) update(ls, x, k);
else update(rs, x, k);
pushup(p);
}
ll q1(int p, int x, int y) {
if(x <= tr[p].l && tr[p].r <= y) {
return tr[p].sum;
}
int mid = (tr[p].l + tr[p].r);
int s = 0;
if(x <= mid) s += q1(ls, x, y);
if(y > mid) s += q1(rs, x, y);
return s%mod;
}
ll q2(int p, int x, int y) {
if(x <= tr[p].l && tr[p].r <= y) {
return tr[p].psum;
}
int mid = (tr[p].l + tr[p].r);
int s = 0;
if(x <= mid) s += q2(ls, x, y);
if(y > mid) s += q2(rs, x, y);
return s%mod;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
build(1, 1, n);
ll op, x, y;
while(m--) {
cin >> op >> x >> y;
if(op == 1) {
update(1, x, y);
}
else {
ll s1 = q1(1, x, y);
ll s2 = q2(1, x, y);
ll inv = qpow(y-x+1);
ll ave = s1*inv%mod;
ll d = s2*inv%mod - ave*ave%mod;
d = (d%mod+mod)%mod;
cout << d << '\n';
}
}
return 0;
}