#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ls id<<1
#define rs id<<1|1
#define N 100005
ll qpow(ll a, ll b, ll p) {
ll res = 1;
while (b > 0) {
if (b & 1) {
res = res * a % p;
}
a = a * a % p;
b >>= 1;
}
return res;
}
const ll mod = 1000000007;
int n, m;
ll b[N];
struct Tree{
int left, right;
ll sum, powersum;
};
Tree tree[N * 4];
inline void pushup(int id) {
tree[id].sum = (tree[ls].sum + tree[rs].sum) % mod;
tree[id].powersum = (tree[ls].powersum + tree[rs].powersum) % mod;
}
void build(int id, int l, int r) {
tree[id].left = l;
tree[id].right = r;
tree[id].sum = tree[id].powersum = 0;
if (l == r) {
tree[id].sum = b[l];
tree[id].powersum = (b[l] * b[l]) % mod;
return;
}
int mid = l + r >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(id);
}
void modify(int id, int pos, int val) {
if (tree[id].left > pos || tree[id].right < pos) {
return;
}
if (tree[id].left >= pos && tree[id].right <= pos) {
tree[id].sum = val;
tree[id].powersum = val * val % mod;
return;
}
modify(ls, pos, val);
modify(rs, pos, val);
pushup(id);
}
ll querysum(int id, int l, int r) {
if (tree[id].left > r || tree[id].right < l) return 0;
if (tree[id].left >= l &&tree[id].right <= r) {
return tree[id].sum % mod;
}
return (querysum(ls, l, r) + querysum(rs, l, r)) % mod;
}
ll querypsum(int id, int l, int r) {
if (tree[id].left > r || tree[id].right < l) return 0;
if (tree[id].left >= l &&tree[id].right <= r) {
return tree[id].powersum % mod;
}
return (querypsum(ls, l, r) + querypsum(rs, l, r)) % mod;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld", &b[i]);
}
build(1, 1, n);
while (m--) {
int c, x;
ll y;
scanf("%d%d%lld", &c, &x, &y);
if (c == 1) {
modify(1, x, y);
} else {
ll inv = qpow(y - x + 1, mod - 2, mod);
ll sm = querysum(1, x, y), pwsm = querypsum(1, x, y);
ll a = sm * inv % mod;
ll v = (pwsm - 2ll * a % mod * sm % mod + a * a % mod * (y - x + 1) % mod) * inv % mod;
printf("%lld\n", v);
}
}
return 0;
}
就过了第一组样例!求助啊谢谢!