hdoj1754(线段树)

练下区间最大值的手lololol,以前写线段树竟然超时。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define lson l,mid,sz<<1
#define rson mid+1,r,sz<<1|1 
using namespace std;
const int sz = 200001;

int a[sz<<2];

void buildd(int l,int r,int sz){
	if(l == r){
		scanf("%d",&a[sz]);
		return;
	}
	int mid = (l+r)>>1;
	buildd(lson);
	buildd(rson);
	a[sz] = max(a[sz<<1],a[sz<<1|1]);
}

void add(int l,int r,int sz,int aa,int bb){
	if(l == r&&l == aa){
		a[sz] = bb;
		return;
	}
	int mid = (l+r)>>1;
	if(aa > mid) add(rson,aa,bb);
	else add(lson,aa,bb);
	a[sz] = max(a[sz<<1],a[sz<<1|1]);
}

int un(int l,int r,int sz,int aa,int bb){
	if(l >= aa&&bb >= r){
		return a[sz];
	}
	int mid = (l+r)>>1;
	int q1 = 0;
	if(mid >= aa) q1 = max(q1,un(lson,aa,bb));
	if(mid < bb) q1 = max(q1,un(rson,aa,bb));
	return q1;
}

int main(){
	int n,m,a,b;
	char q;
	while(~scanf("%d%d",&n,&m)){
	buildd(1,n,1);
	while(m--){
		getchar();
		scanf("%c%d%d",&q,&a,&b);
		if(q == 'U'){
			add(1,n,1,a,b);
		}
		else{
			cout<<un(1,n,1,a,b)<<endl;
		}
	}
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/dukig/article/details/89220531