线段树求大佬调!
查看原帖
线段树求大佬调!
751149
hehuanlong123456楼主2022/8/1 17:58
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+20;
int sumv[maxn*4],a[maxn];
int x,y,v,op;
void build(int o,int l,int r)
{
	if(l==r)
	{
		sumv[o]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(o*2,l,mid);
	build(o*2+1,mid+1,r);
	sumv[o]=sumv[o*2]+sumv[o*2+1];
}
void update(int o,int l,int r)
{
	if(l==r)
	{
		sumv[o]+=v;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid)
	{
		update(o*2,l,mid);
	}
	else
	{
		update(o*2+1,mid+1,r);
	}
	sumv[o]=sumv[o*2]+sumv[o*2+1];
}
int query(int o,int l,int r)
{
	if(x<=l&&y>=r)
	{
		return sumv[o];
	}
	int m=(l+r)/2;
	int ans=0;
	if(x<=m) ans+=query(o*2,l,m);
	if(y>m) ans+=query(o*2+1,m+1,r);
	return ans;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d",&x,&v);
			update(1,1,n);
		}
		else
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",query(1,1,n));
		}
	}
	return 0;
}
2022/8/1 17:58
加载中...