树状数组 1:
#include<cstdio>
using namespace std;
const int N = 1e7;
int n,m;
int c[N];
int lowbit(int x){
return x & ( - x );
}
void add(int x, int k){
while(x <= n){
c[x] += k;
x += lowbit(x);
}
}
int get_sum(int x){
int ans = 0;
while(x >= 1){
ans += c[x];
x -= lowbit(x);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i ++){
int k;
scanf("%d",&k);
add(i, k);
}
for(int i = 1;i <= m;i ++){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op == 1){
add(x,y);
}
else if(op == 2){
printf("%d\n",get_sum(y) - get_sum(x - 1));
}
}
return 0;
}
树状数组2:
#include<cstdio>
using namespace std;
const int N = 1e6;
int tree[N];
int a[N];
int n,m;
typedef long long LL;
int lowbit(int x){
return x & (- x);
}
void add(int x, LL k){
while(x <= n){
tree[x] += k;
x += lowbit(x);
}
}
int Get(int x){
LL ans = 0;
while(x >= 1){
ans += tree[x];
x -= lowbit(x);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i ++){
scanf("%d",&a[i]);
add(i, a[i] - a[i - 1]);
}
while(m --){
int op;
scanf("%d",&op);
if(op == 1){
int x, y, k;
scanf("%d%d%d",&x, &y, &k);
add(y + 1, -k);
add(x, k);
}
else if(op == 2){
int x;
scanf("%d",&x);
printf("%lld\n",Get(x));
}
}
return 0;
}