线段树模板

文章介绍了使用C++编写的二叉树数据结构(xds),包含pushup、build、query和change函数,用于处理数组的范围更新和查询操作。
摘要由CSDN通过智能技术生成

链接

代码

#include<iostream>
using namespace std;
struct xds{
	int l,r;
	long long int sum;
}res[4000005];
long long int a[1000005];
void pushup(int id){
	res[id].sum=res[id*2].sum+res[id*2+1].sum;
}
void build(int id,int l,int r){
	res[id].l=l;
	res[id].r=r;
	if(l==r){
		res[id].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	pushup(id);
}
long long int query(int id,int l,int r){
	int L=res[id].l,R=res[id].r;
	if(l<=L&&R<=r){
		return res[id].sum;
	}
	int mid=(L+R)/2;
	long long int ans=0;
	if(l<=mid)
	ans+=query(id*2,l,r);
	if(r>mid)
	ans+=query(id*2+1,l,r);
	return ans;
}
void change(int id,int pos,long long int k){
	int l=res[id].l,r=res[id].r;
	if(l==r){
		res[id].sum+=k;
		return;
	}
	int mid=(l+r)/2;
	if(pos<=mid)
	change(id*2,pos,k);
	else
	change(id*2+1,pos,k);
	pushup(id);
}
int main(){
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		int b,c,d;
		cin>>b>>c>>d;
		if(b==1)
		change(1,c,d);
		else
		cout<<query(1,c,d)<<endl;;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值