树状数组20分求调
查看原帖
树状数组20分求调
520638
Yaco_Naomi_Jane楼主2024/8/9 14:21
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x) 
long long a[50000005];
long long n, m;
void add(int x, long long k)
{
	a[x]+=k;
	int f=x+lowbit(x);
	while(f<=n)
	{
		a[f]+=k;
		f+=lowbit(f);
	}
}

long long Solve(int x)
{
	if(x==0)	return 0;
	long long ans=0;
	for(int i=x; i>0; i-=lowbit(i))
		ans+=a[i];
	return ans; 
} 
 
void coot(int x, int y)
{
	long long ans=Solve(x-1);
	long long ans2=Solve(y);
	cout<<(long long)(ans2-ans)<<endl; 
} 
void Create(int i)
{
	long long x=lowbit(i);
	long long xx=x/2, now=i-x;
	while(xx>0)
	{
		a[i]+=a[now+xx]; now=now+xx;
		xx/=2;
	}
}

int main()
{
	long long j, x, y; long long k;
	cin>>n>>m;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		Create(i); 
	}
	while(m--)
	{
		cin>>j;
		if(j==1)
		{
			cin>>x>>k;
			add(x, k);
		}
		else
		{
			cin>>x>>y;
			coot(x, y);
		}
	} 
	
	return 0;
 }
2024/8/9 14:21
加载中...