洛谷P3374树状数组1


常规模板题,lowbit(x)=x&-x;求和往左走,点加往右走。

#include<bits/stdc++.h>
#define maxn 1000000
using namespace std;
int arr[maxn];int n,m,x,y,d;
int lowbit(int x)
{
	return x&(-x);
}
void add(int x,int d)
{//右走
	while(x<=n)
	{
		arr[x]+=d;x+=lowbit(x);
	}
}
int sum(int x)
{//左走
	int ans=0;
	while(x>0)
	{
		ans+=arr[x];x-=lowbit(x);
	}
	return ans;
}
void build()
{
	for(int i=1;i<=n;i++)
	{
		int num=0;cin>>num;
		add(i,num);
	}
}
int main()
{
	cin>>n>>m;build();
	int op=0;
	for(int i=1;i<=m;i++)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>d;
			add(x,d);
		}
		if(op==2)
		{
			cin>>x>>y;
			cout<<sum(y)-sum(x-1)<<endl;
		}
	}
	return 0;
}
posted @ 2019-05-20 22:42  一块钱的争论  阅读(87)  评论(0编辑  收藏  举报