第一次学线段树,0pts求救!
查看原帖
第一次学线段树,0pts求救!
1006142
zhouyixuan11楼主2024/10/20 15:48

rt

#include<bits/stdc++.h>
using namespace std;
const int MAXN=114514*5;
int a[MAXN*4],n,m;
void build(int x,int lft,int rgt)
{
	if(lft==rgt) 
	{
		cin>>a[x];
		return ;
	}
	int mid=(lft+rgt)/2;
	build(2*x,lft,mid);
	build(2*x+1,mid+1,rgt);
	a[x]=a[2*x+1]+a[2*x];
	return ;
} 
void update(int rt,int b,int lft,int rgt,int x)//a[rt]->a[rt]+b
{
	if(lft==rgt) 
	{
		a[rt]+=b;
		return ;
	}
	int mid=(lft+rgt)/2;
	if(rt<=mid)
	{
		update(rt,b,lft,mid,2*x);
	}
	else
	{
		update(rt,b,mid+1,rgt,2*x+1); 
	}
	a[x]=a[x*2]+a[x*2+1];
}
int query(int l,int r,int x,int nl,int nr)
{
	if(nl<=l&&r<=nr) return a[x];
	int mid=(l+r)/2;
	if(nl<=mid)
	{
		if(mid<nr)
		{
			return query(l,mid,2*x,nl,nr)+query(mid+1,r,2*x+1,nl,nr);
		}
		else
		{
			return query(l,mid,2*x,nl,nr);
		}
	}
	else
	{
		return query(mid+1,r,2*x+1,nl,nr);
	}
}
int main()
{
	cin>>n>>m;
	build(1,1,n);
	while(m--)
	{
		int opt,c,d;
		cin>>opt>>c>>d;
		if(opt==1)
		{
			update(c,d,1,n,1);
		}
		else
		{
			cout<<query(1,n,1,c,d)<<endl;
		}
	}
    return 0;
}
2024/10/20 15:48
加载中...