hdu 1754 I Hate It

也是属于线段树单点更新类型的题目。总体比较简单,很容易看懂。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

#include <cstdio>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxx=200001;

int maxn[maxx<<2];

int max(int a,int b){
	return a>b?a:b;
}

void pushUp(int rt){
	maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]);
}

int query(int L,int R,int l,int r,int rt){
	if(L<=l && R>=r){
		return maxn[rt];
	}
	int m=(l+r)>>1;
	int ret=0;
	if(L<=m)ret=max(ret,query(L,R,lson));
	if(R>m)ret=max(ret,query(L,R,rson));
	return ret;
}

void build(int l,int r,int rt){
	if(l==r){
		scanf("%d",&maxn[rt]);
		return ;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	pushUp(rt);
}

void update(int p,int sc,int l,int r,int rt){
	if(l==r){
		maxn[rt]=sc;
		return ;
	}
	int m=(l+r)>>1;
	if(p<=m)update(p,sc,lson);
	else update(p,sc,rson);
	pushUp(rt);
}

int main(){
    int n,m,a,b;
	while(scanf("%d%d",&n,&m)!=EOF){
		build(1,n,1);
		char op[3];
		while(m--){
			 scanf("%s%d%d",op,&a,&b);
			 if(op[0]=='Q')printf("%d\n",query(a,b,1,n,1));
			 else update(a,b,1,n,1);
		}
	}
	return 0;
}


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