模板数状数组

树状数组1

如题,已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 xxx

  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 n个用空格分隔的整数,其中第 i个数字表示数列第 i项的初始值。

接下来 m 行每行包含 3 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 x 个数加上 k

  • 2 x y 含义:输出区间 [x,y] 内每个数的和

输出格式

输出包含若干行整数,即为所有操作 222 的结果。

 

 

 

 

#include<iostream>
using namespace std;
int n,m,j,g,q,p,b;
int i=1;
int a[500000];
int add(int x,int k)
{
	for(;x<=n;x+=(x&-x))
	a[x]=a[x]+k;
}
int sum(int x)
{
	int ans=0;
	for(;x;x-=(x&-x))
	ans=ans+a[x];
	return ans;
}
int main()
{
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		cin>>b;
	    add(i,b);
	}
	for(i=1;i<=m;i++)
	{
		cin>>g>>q>>p;
		if(g==1)
		add(q,p);
		else
		{
			cout<<sum(p)-sum(q-1)<<endl;
		}
	}
}

 

 

posted @ 2020-08-20 20:38  weidan01  阅读(65)  评论(0)    收藏  举报