题目:
输入样例:
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);elseprintf("%d\n",query(b)-query(a-1));//在线区间和}return 0;
}