树状数组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\n",query(x));
		}
	}
	return 0;
}