poj 3468

线段树区间更新,区间查询。。

#include<iostream>
#include<algorithm>
using namespace std;

#define MAXN 100005
#define lson u<<1
#define rson u<<1|1
#define LL __int64

struct Node{
	int lef,rig;
	LL sum,delta;//增值
}T[MAXN<<2];

int dat[MAXN];

void Build(int u,int l,int r){
	T[u].lef=l;
	T[u].rig=r;
	T[u].delta=0;
	if(l==r){T[u].sum=dat[l];return;}
	int mid=(l+r)>>1;
	Build(lson,l,mid);
	Build(rson,mid+1,r);
	T[u].sum=T[lson].sum+T[rson].sum;
}

void Update(int u,int l,int r,LL v){
	if(l<=T[u].lef&&T[u].rig<=r){
		T[u].delta+=v;
		T[u].sum+=(T[u].rig-T[u].lef+1)*v;
	}
	else {
		if(T[u].delta){
			T[lson].delta+=T[u].delta;
			T[rson].delta+=T[u].delta;
			T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta;
			T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta;
			T[u].delta=0;
		}
		if(r<=T[lson].rig)Update(lson,l,r,v);
		else if(l>=T[rson].lef)Update(rson,l,r,v);
		else {
			Update(lson,l,T[lson].rig,v);
			Update(rson,T[rson].lef,r,v);
		}
		T[u].sum=T[lson].sum+T[rson].sum;
	}
}

LL Query(int u,int l,int r){
	if(l<=T[u].lef&&T[u].rig<=r){return T[u].sum;}
	else {
		if(T[u].delta){
			T[lson].delta+=T[u].delta;
			T[rson].delta+=T[u].delta;
			T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta;
			T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta;
			T[u].delta=0;
		}
		if(r<=T[lson].rig)return Query(lson,l,r);
		else if(l>=T[rson].lef)return Query(rson,l,r);
		else return Query(lson,l,T[lson].rig)+Query(rson,T[rson].lef,r);
	}
}

int main(){
	int N,Q,i;
	int x,y,z;
	char cmd;
	while(scanf("%d%d",&N,&Q)==2){
		for(i=1;i<=N;i++)scanf("%d",&dat[i]);
		Build(1,1,N);
		while(Q--){
			scanf(" %c",&cmd);
			if(cmd=='C'){
				scanf("%d%d%d",&x,&y,&z);
				Update(1,x,y,z);
			}
			else {
				scanf("%d%d",&x,&y);
				LL ans=Query(1,x,y);
				printf("%I64d\n",ans);
			}
		}
	}
}


你可能感兴趣的:(c,struct,cmd,query,Build)