树状数组简要总结-3.代码实现

时间:2024-03-24 07:32:28
#include<iostream>
using namespace std;
int sum[500001],n,m;

//求二进制下最末一个1
int lowbit(int x)
{
	return x&(-x);
}

//单点加
void add(int idx,int x)
{
	for(int i=idx;i<=n;i+=lowbit(i))
	sum[i]+=x;
}

//[1,x]和查询
int query_sum(int x)
{
	int ans=0;
	for(int i=x;i>=1;i-=lowbit(i))
	ans+=sum[i];
	return ans;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		add(i,x);
	}
	for(int i=1;i<=m;i++)
	{
		int order;
		cin>>order;
		if(order==1)
		{
			int x,k;
			cin>>x>>k;
			add(x,k);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<(query_sum(y)-query_sum(x-1))<<endl;
		}
	}
	return 0;
}