hdu 1754 I Hate It_线段树

题意:略

思路:套hdu1166模版改改就行了,要注意的是,网上有的代码是错的,还贴出来...

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 200100
int n,ans;
struct{
	int l,r,value,max;
}tree[MAXN<<2];
void Build(int l,int r,int id){
	tree[id].l=l;
	tree[id].r=r;
	tree[id].max=-1;
	if(l!=r){
		int mid=(l+r)>>1;
		Build(l,mid,id<<1);
		Build(mid+1,r,id<<1|1);
	}
}
void update(int l,int value,int id){
	if(tree[id].l==tree[id].r&&tree[id].l==l){
		tree[id].max=value;
		return;
	}
	int mid=(tree[id].l+tree[id].r)>>1;
	if(l<=mid)
		update(l,value,id<<1);
	else
		update(l,value,id<<1|1);
	tree[id].max=max(tree[id<<1|1].max,tree[id<<1].max);

}
void query(int l,int r,int id){
	
	if(tree[id].l==l&&tree[id].r==r){
		ans=max(ans,tree[id].max);
		return;
	}
	int mid=(tree[id].l+tree[id].r)>>1;
	if(r<=mid)
		return query(l,r,id<<1);
	else if(l>mid)
		return query(l,r,id<<1|1);
	else{
		query(l,mid,id<<1);
		query(mid+1,r,id<<1|1);
	}
}
int main(int argc, char** argv) {
	int t,x,y,n,i,value,m;
	char str[5];
	while(scanf("%d%d",&n,&m)!=EOF){
		Build(1,n,1);
		for(i=1;i<=n;i++){
			scanf("%d",&value);
			update(i,value,1);
		}
		for(i=0;i<m;i++){
			scanf("%s %d%d",str,&x,&y);
			if(str[0]=='U')update(x,y,1);
			else{	
				ans=0;	
				query(x,y,1);
				printf("%d\n",ans);
			}
		}
	}
	return 0;
}


posted @ 2014-02-22 23:50  Teemo的技术blog  阅读(107)  评论(0编辑  收藏  举报