HDU 1754 I Hate It

2014-11-23 21:27:57 · 作者: · 浏览: 5
分析:继续单点更新、学线段树的时候尽量不要去看模板、自己慢慢分析、那样才是真的学会了、尽管变形依然能做出来、单点更新先就做到这里、
 
#include  
#include  
#define N 200005  
struct node{  
    int l,r;  
    int max;  
}tree[N<<2];  
int a[N];  
int n,ans;  
int maxx(int a,int b){  
    if(a>b)return a;  
    return b;  
}  
void create(int x,int l,int r){  
    tree[x].l=l;  
    tree[x].r=r;  
    int mid=(l+r)/2;  
    if(l==r){  
        tree[x].max=a[l];  
        return;  
    }  
    create(x*2,l,mid);  
    create(x*2+1,mid+1,r);  
    tree[x].max=maxx(tree[x*2].max,tree[x*2+1].max);  
}  
void update(int x,int p,int num){  
    if(tree[x].l==p&&tree[x].r==p){  
        tree[x].max=num;  
        return;  
    }  
    int mid=(tree[x].l+tree[x].r)/2;  
    if(p<=mid)  
        update(x*2,p,num);  
    else  
        update(x*2+1,p,num);  
    tree[x].max=maxx(tree[x*2].max,tree[x*2+1].max);  
}  
void query(int x,int l,int r){  
    if(tree[x].l==l&&tree[x].r==r){  
        ans=maxx(ans,tree[x].max);  
        return;  
    }  
    int mid=(tree[x].l+tree[x].r)/2;  
    if(l>
mid) query(x*2+1,l,r); else if(r<=mid) query(x*2,l,r); else{ query(x*2,l,mid); query(x*2+1,mid+1,r); } } int main(){ int m,i,x,y; char ch[5]; while(scanf("%d%d",&n,&m)!=EOF){ memset(a,0,sizeof(a)); for(i=1;i<=n ;i++) scanf("%d",&a[i]); create(1,1,n); while(m--){ scanf("%s%d%d",ch,&x,&y); if(ch[0]=='U'){ update(1,x,y); } if(ch[0]=='Q'){ ans=0; query(1,x,y); printf("%d\n",ans); } } } return 0; }