hdu 1754 I Hate It

#include<stdio.h>
#include<string.h>
struct In{
    int l;
    int r;
    int max;
}tree[200010*4];
int num[200010],ans;
int Max(int a,int b){
    return a>b?a:b;
}
void create(int l,int r,int i){
    tree[i].l=l;
    tree[i].r=r;//!!!
    if(l==r){
        tree[i].max=num[l];
        return ;
    }
    int mid=(l+r)/2;
    create(l,mid,i*2);
    create(mid+1,r,i*2+1);
    tree[i].max=Max(tree[i*2].max,tree[i*2+1].max);
}
void update(int k,int v,int i){
    if(tree[i].l==tree[i].r&&tree[i].l==k){
        tree[i].max=v;
        return ;
    }
    int mid=(tree[i].l+tree[i].r)/2; 
    if(k<=mid) update(k,v,i*2);
    else update(k,v,i*2+1);
    tree[i].max=Max(tree[i*2].max,tree[i*2+1].max);
}
void search(int l,int r,int i){
    if(tree[i].l==l&&tree[i].r==r){
        ans=Max(ans,tree[i].max);//比较大小 
        return ;
    }
    int mid=(tree[i].l+tree[i].r)/2;
    if(r<=mid){
        search(l,r,i*2);       
    }else if(l>mid){
        search(l,r,i*2+1);
    }else{
        search(l,mid,i*2);
        search(mid+1,r,i*2+1);
    }
}
int main(){
    int n,m,i,j,a,b;
    char s[10];
    while(~scanf("%d%d",&n,&m)){
        memset(num,0,sizeof(num));
        for(i=1;i<=n;i++){
            scanf("%d",&num[i]);
        }
        create(1,n,1);
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%s%d%d",s,&a,&b);
            if(s[0]=='Q'){
                ans=0;
                search(a,b,1);
                printf("%d\n",ans);
            }else{
                update(a,b,1);
            }
        }
    }
    return 0;
}


 

你可能感兴趣的:(hdu 1754 I Hate It)