【複習模版題】【Hdu 1166】【線段樹單點修改 區間查詢】

傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=1166

線段樹模版題

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 50005
using namespace std;

inline int wread(){
	char c=getchar ();int flag=1,wans=0;
	while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();}
	while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();}
	return wans*=flag;
}

inline void OUT (int x){
	if (x>9)	OUT(x/10);
	putchar (x%10+'0');
}

inline void init (){
	freopen (" ","r",stdin);
	freopen (" ","w",stdout);
}

int T;
int n;
struct node {int l,r,sum;}tre[N*4];
char s[40];

void make_tre (int a,int l,int r){
	tre[a].l=l;tre[a].r=r;tre[a].sum=0;
	if (l==r){tre[a].sum=wread();return ;}
	int lson (a<<1),rson (a<<1|1),mid (l+r>>1);
	make_tre (lson,l,mid);
	make_tre (rson,mid+1,r);
	tre[a].sum=tre[lson].sum+tre[rson].sum;
	return ;
}

int fnd_ans (int a,int l,int r){
	if (tre[a].l>=l && tre[a].r<=r)	return tre[a].sum;
	int mid (tre[a].l+tre[a].r>>1),lson (a<<1),rson (a<<1|1);
	if (r<=mid)	return fnd_ans (lson,l,r);
	else if (l>mid)	return fnd_ans (rson,l,r);
	else return fnd_ans (lson,l,r)+fnd_ans (rson,l,r);
}

void add_dian (int a,int pos,int x){
	if (tre[a].l==pos && tre[a].r==pos)	{tre[a].sum+=x;return ;}
	int mid (tre[a].l +tre[a].r >>1),lson (a<<1),rson (a<<1|1);
	if (pos<=mid)	add_dian (lson,pos,x);
	else add_dian (rson,pos,x);
	tre[a].sum=tre[lson].sum + tre[rson].sum;	
}

int main (){
//	init ();
	T=wread();
	for (int A(1);A<=T;++A){
		printf("Case ");
		OUT(A);
		puts(":");
		
		n=wread();
		make_tre (1,1,n);
		while (1){
			scanf ("%s",s);
			if (s[0]=='E')	break;
			if (s[0]=='Q'){
				int st(wread()),ed(wread());
				OUT(fnd_ans (1,st,ed));
				putchar ('\n');
			}
			else if (s[0]=='A'){
				int pos(wread()),x(wread());
				add_dian (1,pos,x);
			}
			else {
				int pos (wread()),x(wread());
				add_dian (1,pos,-x);				
			}
		}
		
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章