为什么只能过一个点,没看出来问题呀
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
const int mod = 1e9 + 7;
int n, m, tr1[100010], tr2[100010];
int qpow(int a) {
int b = mod - 2, ans = 1;
while (b) {
if (b & 1)ans = (a * ans) % mod;
a = (a * a) % mod;b >>= 1;
}
return ans;
}
void add(int tr[], int x, int k) {
while (x <= n)tr[x] = (tr[x] + k) % mod, x += lowbit(x);
}
int query(int tr[], int x) {
int ans = 0;
while (x)ans = (ans + tr[x]) % mod, x -= lowbit(x);
return ans % mod;
}
void solve() {
cin >> n >> m;
for (int i = 1;i <= n;i++) {
int x;cin >> x;
add(tr1, i, x % mod);
add(tr2, i, (x * x) % mod);
}
while (m--) {
int op, x, y;cin >> op >> x >> y;
if (op == 1) {
int p1 = (query(tr1, x) - query(tr1, x - 1)) % mod;
int p2 = (query(tr2, x) - query(tr2, x - 1)) % mod;
add(tr1, x, (y - p1) % mod);
add(tr2, x, (y * y - p2) % mod);
} else {
int sum = (query(tr1, y) - query(tr1, x - 1)) % mod;
int sqsum = (query(tr2, y) - query(tr2, x - 1)) % mod;
int inv = qpow(y - x + 1);
int ans1 = (sum * inv) % mod;
int ans2 = (sqsum * inv) % mod;
int ans = ans2 % mod - (ans1 * ans1) % mod;
cout << (ans + mod) % mod << '\n';
}
}
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int _ = 1;
// cin >> _;
while (_--)
solve();
}