rt,10 pts,柿子推对了样例过了,取模也挺到位的,不知道为啥只有 10 pts,求好心人帮助。
code :
#include <bits/stdc++.h>
#define ll long long
#define db double
#define pll pair<ll, ll>
#define vec vector
#define pb push_back
#define endl "\n"
#define ls (u << 1)
#define rs (u << 1 | 1)
const ll mod = 1e9 + 7;
using namespace std;
ll n, m, q, a[200005]; // string s;
ll opt, l, r, ans = 0;
struct segment {
ll l, r, sum, sum2;
} w[800005] ;
void pushup(ll u) {
w[u].sum = (w[ls].sum + w[rs].sum) % mod, w[u].sum %= mod;
w[u].sum2 = (w[ls].sum2 + w[rs].sum2) % mod, w[u].sum2 %= mod;
}
void build(ll u, ll l, ll r) {
w[u].l = l, w[u].r = r;
if (l == r) {
w[u].sum = (a[l]) % mod, w[u].sum2 = (a[l] * a[l]) % mod;
return ;
}
ll md = l + ((r - l) >> 1);
build(ls, l, md), build(rs, md + 1, r);
}
ll qsum(ll u, ll l, ll r) {
if (l <= w[u].l && w[u].r <= r) {
return w[u].sum % mod;
}
ll md = w[u].l + ((w[u].r - w[u].l) >> 1), res = 0;
if (l <= md) res += (qsum(ls, l, r) % mod), res %= mod;
if (r > md) res += (qsum(rs, l, r) % mod), res %= mod;
return res % mod;
}
ll qsum2(ll u, ll l, ll r) {
if (l <= w[u].l && w[u].r <= r) {
return w[u].sum2 % mod;
}
ll md = w[u].l + ((w[u].r - w[u].l) >> 1), res = 0;
if (l <= md) res += (qsum2(ls, l, r) % mod), res %= mod;
if (r > md) res += (qsum2(rs, l, r) % mod), res %= mod;
return res % mod;
}
void modify(ll u, ll x, ll y) {
if (w[u].l == w[u].r && w[u].l == x) {
w[u].sum = (y % mod), w[u].sum2 = ((y * y) % mod); return ;
}
ll md = w[u].l + ((w[u].r - w[u].l) >> 1);
if (x <= md) modify(ls, x, y);
else modify(rs, x, y);
pushup(u);
}
ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) {
res = res * a % mod, res %= mod;
}
a = (a * a % mod) % mod, b >>= 1;
}
return (res % mod);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
ll i, j, k, x, y, z, res, now = 0;
cin >> n >> m;
for (i = 1; i <= n; i++) cin >> a[i], a[i] %= mod;
build(1, 1, n);
while (m--) {
cin >> opt >> x >> y;
if (opt == 1) {
modify(1, x, (y % mod));
} else {
ll ny = qpow((y - x + 1), mod - 2) % mod;
ll pj = ((qsum(1, x, y) % mod) * (ny % mod)) % mod;
ll p1 = qsum2(1, x, y) % mod, p2 = ((y - x + 1) * pj) % mod * pj % mod;
ll res = ((p1 % mod - ((2 * (pj * qsum(1, x, y) % mod) % mod) % mod) + mod) % mod + p2 % mod + mod) % mod;
(res *= ny) %= mod, res %= mod;
cout << res << endl;
}
}
return 0;
}