hdu 1754 I Hate It_线段树

时间:2024-07-25 15:36:26

题意:略

思路:套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;
}