#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int n, m;
ll u[maxn];
ll t1[maxn];
ll t2[maxn];
ll lowbit(ll x) {
return x & (-x);
}
void Update(ll i, ll k) {
ll x = i;
while (i <= n) {
t1[i] += k;
t2[i] += k * (x - 1);
i += lowbit(i);
}
}
ll get_sum(ll i) {
ll sum = 0, x = i;
while (i >= 1) {
sum += x * t1[i] - t2[i];
i -= lowbit(i);
}
return sum;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> u[i];
}
for (int i = 1; i <= n; i++) {
ll d = u[i] - u[i - 1];
Update(i, d);
}
while (m--) {
int sign;
cin >> sign;
if (sign == 1) {
//区间修改
int l, r, k;
cin >> l >> r >> k;
Update((ll)l, k);
Update((ll)r + 1ll, -k);
}
else {
//区间查询
ll l, r;
cin >> l >> r;
cout << get_sum(r) - get_sum(l - 1) << endl;
}
}
return 0;
}
Template-summation of one-dimensional tree array (interval modification, interval query)
Guess you like
Origin blog.csdn.net/qq_45739057/article/details/105471754
Recommended
Ranking