单点时限: 2.0 sec
内存限制: 256 MB
有数列 a1,a2,…,an,你需要支持以下两种操作:
操作 1:给出参数 x,d,令 ax=ax+d;
操作 2:给出参数 l,r,求 al+al+1+…+ar。
输入格式
第一行,一个整数 n (1≤n≤5⋅105)。
第二行,n 个整数 a1,a2,…,an。
第三行,一个整数 q (1≤q≤5⋅105)。
接下来 q 行,每行表示一个查询,查询格式如下所示:
1 x d,或
2 l r。
其中:1≤x≤n,1≤l≤r≤n。
所有数的绝对值不超过 107。
输出格式
对于每次求和查询,输出答案。
样例
input
5
1 2 3 4 5
5
1 1 2
2 1 2
1 5 1
2 1 5
2 3 3
output
5
18
3
扫描二维码关注公众号,回复:
11235298 查看本文章
/*
参见树状数组点增加。
*/
#include<iostream>
#define lowbit(x) (x&(-x))
using namespace std;
const int Max=5e5+2;
int n;
long long c[Max];
void updata(int x,int v) {
for(int i=x; i <= n; i+=lowbit(i)) {
c[i]+=v;
}
}
long long getSum(int x) {
long long sum=0;
for(int i = x; i > 0; i-=lowbit(i)) {
sum+=c[i];
}
return sum;
}
int main() {
cin>>n;
int a[n+1];
for(int i = 1; i <= n; i++) {
scanf("%d",a+i);
c[i]=0;
for(int j = i; i-j<lowbit(i); j--)
c[i]+=a[j];
}
int q;
cin>>q;
for(int i = 0; i< q; i++) {
int t,x,y;
cin>>t>>x>>y;
if(t==1) {
updata(x,y);
} else {
cout<<getSum(y)-getSum(x-1)<<endl;
}
}
return 0;
}