树状数组代码记录

树状数组代码记录

因为发现树状数组除了代码已经忘干净了,所以放一张图。

不难通过图来理解。

#include<iostream> 
#define N 1000001
using namespace std;
int a[N],c[N];

int n,m;

int lowbit(int x)
{
	return x&-x;//例子:x=30 其二进制为 11110 返回的是10的十进制 
}
int query(int x)
{
	int sum=0;
	for(int i=x;i>0;i-=lowbit(i))
	{
		sum+=c[i];
	} 
	return sum;
} 
void add(int x,int delta)
{
	for(int i=x;i<=n;i+=lowbit(i)) c[i]+=delta;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		add(i,a[i]);
	}
	
	for(int i=1;i<=m;i++)
	{
		int q,x,y;
		cin>>q>>x>>y;
		if(q==1) add(x,y);
		if(q==2)
		{
			cout<<query(y)-query(x-1)<<endl;
		}
	}
} 
原文地址:https://www.cnblogs.com/TianMeng-hyl/p/14975208.html