线段树写这一题70分求助
查看原帖
线段树写这一题70分求助
228451
he1234QWQ楼主2021/2/2 15:37
#include<bits/stdc++.h>
using namespace std;
long long t[500000],a[500000],lan[500000];
void f(long long x,long long l,long long r)
{
		if(l==r)
		{
			t[x]=a[l];
			return ;
		}
		long long mid=(l+r)/2;
		f(x*2,l,mid);
		f(x*2+1,mid+1,r);
		t[x]=t[x*2]+t[x*2+1];
}
long long sum(long long x,long long l,long long r,long long L,long long R)
{
	if(L<=l&&r<=R)
	return t[x];
	long long ans=0;
	long long mid=(l+r)/2;
	if(L<=mid)
	ans+=sum(x*2,l,mid,L,R);
	if(mid<R)
	ans+=sum(x*2+1,mid+1,r,L,R);
	t[x]=t[x*2]+t[x*2+1];
	return ans;
}

void f2(long long x,long long l,long long r,long long p,long long v)
{
	if(l==r)
	{
		t[x]+=v;
		return ;
	}
	int mid=(l+r)/2;
	if(p<=mid)
	{
		f2(x*2,l,mid,p,v);
	}
	else
	{
		f2(x*2+1,mid+1,r,p,v);
	}
	t[x]=t[x*2]+t[x*2+1];
}
long long n,m;
int main()
{
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	f(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		long long p;
		scanf("%lld",&p);
		if(p==1)
		{
			long long u,v;
			cin>>u>>v;
			f2(1,1,n,u,v);
		}
			else
			{
				long long u,v;
				cin>>u>>v;
				cout<<sum(1,1,n,u,v)<<endl;
			}
		
	}
	return 0;
}
2021/2/2 15:37
加载中...