题目
输入样例
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
输出样例
6
10
解题思路
差差差差差差分
建一个差分树,在 x 的位置+1,在y + 1 位置上-1,最后的答案就是累加
差分
num:5 1 6 8
差分:5 -4 5 2
累加差分数就可以得到当前位是多少(5+(-4)=1)(5+(-4)+5+2=8)
在[2,3]区间+1,即在 2 位置上+1,在 4 位置上-1
差分:5 -3 5 1
(5+(-3)=2)(5+(-3)+5=7)(5+(-3)+5+1=8)
Code
#include <bits/stdc++.h>
#define N 500000
#define ll long long
using namespace std;
ll n, m, x, y, z, c, p, t[N + 200];
ll lowbit(ll x) { return (x & -x); }
void add(ll x, ll y) {
for(; x <= n; x += lowbit(x)) t[x] += y;
}
ll sum(ll x) {
ll ans = 0;
for(; x; x -= lowbit(x)) ans += t[x];
return ans;
}
int main() {
scanf("%lld %lld", &n, &m);
for(int i = 1; i <= n; i ++) {
scanf("%lld", &c);
add(i, c - p);
p = c;
}
for(int i = 1; i <= m; i ++) {
scanf("%lld", &c);
if(c == 1) {
scanf("%lld %lld %lld", &x, &y, &z);
add(x, z), add(y + 1, -z);
} else {
scanf("%lld", &x);
printf("%lld\n", sum(x));
}
}
}