树状数组 :区间修改,区间查询

模板题
参考博客

#include<cstdio> 
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
typedef long long LL;
LL sum1[N];
LL sum2[N];
int n,q;
void add(int p,LL x){
    
    
	for(int i=p;i<=n;i+=i&-i)
	{
    
    
		sum1[i]+=x;		
		sum2[i]+=p*x;
	}
}
void range_add(int l,int r,LL x){
    
    
	add(l,x);
	add(r+1,-x);	
}
LL ask(int p){
    
    
	LL res=0;
	for (int i = p; i; i -= i & -i)	
     	 res += (p + 1) * sum1[i] - sum2[i];
     	 
	return res;
}
LL range_ask(int l,int r){
    
    
	return ask(r)-ask(l-1);
}
int main()
{
    
    
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
    
    
    LL a;
    scanf("%lld",&a);
    range_add(i,i,a);
	}
	for(int i=1;i<=q;i++){
    
    
		int op,l,r;
		LL x;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
    
    
			scanf("%lld",&x);
			range_add(l,r,x);
		}
		else
		printf("%lld\n",range_ask(l,r));	
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_47154574/article/details/108810553