我的线段树

 注意: 根据线段树的特点 可以用数组模拟 所以比较方便 ,对应1~n编号 ,i 的左孩子为i*2 ,右孩子 2*i+1

其他的,没啥难的 ,递归万岁

#include<iostream>
using namespace std;
#define f(i,l,r) for(int i=l;i<=r;++i)
#define g(i,l,r) for(int i=l;i>=r;--i)
const int N =100010;
int a[N],sum[N<<2];
void pushup(int rt ){
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int rt ,int l ,int r){
	if(l==r){
		sum[rt]=a[l];return ;
	}
	int m = (l+r)>>1;
	build(rt<<1,l,m);
	build(rt<<1|1,m+1,r);
	pushup(rt);
}
void update(int rt ,int l,int r,int pos,int c){
	if(l==r){
		sum[rt]+=c; return ;
	}
	int m= (l+r)>>1;

	if(pos <=m)    update(rt<<1,l,m,pos,c);
	else   update(rt<<1|1,m+1,r,pos,c);
	pushup(rt);
}
int query(int rt ,int l ,int r,int a,int b){
	if(l==a && r==b) return sum[rt];
	int m =(l+r)>>1;
 
	if(b<=m) return query(rt<<1,l,m,a,b);
	else if(a> m) return query(rt<<1|1,m+1,r,a,b);
	else return query(rt<<1,l,m,a,m) + query(rt<<1|1,m+1,r,m+1,b);
}


int main()
{
	ios::sync_with_stdio(false); 
	int n,opt,x,y,m;
	cin>>n;
	f(i,1,n)cin>>a[i];
	build(1,1,n);
	cin>>m;
	f(i,1,m){
		cin>>opt>>x>>y;
		switch(opt){
		case 1:
			update(1,1,n,x,y);
			break;
		case 2:
			cout<<query(1,1,n,x,y)<<endl;
			break;
		}
	}
	return 0;
}

未来的我一定会感谢正在努力的现在的我!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值