本文尚未完成(很抱歉..)
树状数组1:
#include<cstdio>
#include<iostream>
using namespace std;
int n,c[500010];
int lowbit(int x){
return x&-x;
}
void add(int x,int k){
for(;x<=n;x+=lowbit(x))c[x]+=k;
}
int sum(int x,int y){
int ans=0;
for(;y;y-=lowbit(y)){
ans+=c[y];
}
for(x--;x;x-=lowbit(x)){
ans-=c[x];
}
return ans;
}
int main(){
int m;
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 ta,x,y;
scanf("%d%d%d",&ta,&x,&y);
if(ta==1){
add(x,y);
}else if(ta==2){
cout<<sum(x,y)<<endl;
}
}
return 0;
}
树状数组2:
#include<cstdio>
#include<iostream>
#define lowbit(x) x&-x
using namespace std;
long long c[500005];
int n,m;
void add(int x,int num){
for(;x<=n;x+=lowbit(x))c[x]+=num;
}
long long query(int x){
long long ans=0;
for(;x;x-=lowbit(x))ans+=c[x];
return ans;
}
int main(){
scanf("%d%d",&n,&m);
long long last=0,now;
for(int i=1;i<=n;i++){
scanf("%lld",&now);
add(i,now-last);
last=now;
}
for(int i=1;i<=m;i++){
int flg;
scanf("%d",&flg);
if(flg==1){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(x,k);
add(y+1,-k);
}else if(flg==2){
int x;
scanf("%d",&x);
printf("%lld
",query(x));
}
}
return 0;
}