题目:
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
输出样例:
11
30
35
树状数组:
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int a[N],tr[N];
//2^k
int lowbit(int x)
{
return x&-x;
}
//改变数组在位置x上的值(加上某个值)
void add(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i))tr[i]+=v;
}
//求动态(在线)前缀和
int query(int x)
{
int res=0;
for(int i=x;i>0;i-=lowbit(i))res+=tr[i];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)add(i,a[i]);//求得tr[i]
while(m--){
int k,a,b;
scanf("%d%d%d",&k,&a,&b);
if(k==1)add(a,b);
else
printf("%d\n",query(b)-query(a-1));//在线区间和
}
return 0;
}