您的位置:首页 > 其它

[置顶] HDU 1754 线段树

2013-04-14 11:54 295 查看
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>

#define Lson  left , t   , rt<<1
#define Rson  t+1  ,right,rt<<1|1

using namespace std;
const int maxn=200005;
int f[maxn<<2];

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

void build( int left, int right ,int rt ){
if( left==right ){
cin>>f[rt];
return;
}
int t=(left + right)>>1;
build(Lson);
build(Rson);
PushUP(rt);
}

void update(int ii,int value,int left, int right, int rt ){
if( left == right ){
f[rt] = value; return;
}
int t=(left+right)>>1;
if(ii<=t) update(ii, value, Lson);
else      update(ii, value, Rson);
PushUP(rt);
}

int query(int l, int r, int left, int right, int rt ){
if( l<=left && r>=right )
return f[rt];
int t=(left+right)/2;
int ret = 0;
if(l <= t)ret = max(ret, query( l, r, Lson) );
if(r > t) ret = max(ret, query( l, r, Rson) );
return ret;
}

int main(){
int n,m;
while(cin>>n>>m){
build(1,n,1);
while(m--){
char C; int a,b;//for(int i=0;i<=n;++i)cout<<f[i]<<' ';cout<<endl;
cin>>C>>a>>b;
if(C=='Q') cout<<query(a,b,1,n,1)<<endl;
else update(a,b,1,n,1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: