3389. 线段树:点增加

单点时限: 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105874521