7-11 动态区间求和 (10 分)
基本思路
树状数组的基本应用。注意:数据类型使用long long 而不是int ~否则两个测试样例都过不去!
代码
#include <bits/stdc++.h>
#define lowbit(i) ((i)&(-i)) //lowbit写成宏定义的形式
using namespace std;
const int maxn=1000005;
int n,q;//数组长度,查询次数
long long c[maxn];//树状数组(下标为某一个元素,值为这个元素的出现次数)
//update函数将第x个整数加上v
void update(int x,int v){
for(int i=x;i<=n;i=i+lowbit(i)){
c[i]=c[i]+v;
}
}
//getSum函数返回前x个整数之和
long long getSum(int x){
long long sum=0;
for(int i=x;i>0;i=i-lowbit(i)){
sum=sum+c[i];
}
return sum;
}
int main(){
cin>>n>>q;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
int ans;
cin>>ans;
update(i,ans);
}
while(q--){
int x,y,z;
cin>>x>>y>>z;
if(x==1){
update(y,z);
}else{
cout<<getSum(z)-getSum(y-1)<<endl;
}
}
}