模板数状数组
树状数组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;
}
}
}

浙公网安备 33010602011771号