线段树(HDU 1754 I Hate It)

第一次写线段树,参考了一下别人的线段树代码

#define L(x) (x << 1)
#define R(x) ((x << 1) | 1)

code:

#include <stdio.h>
#define max(x,y) x>y?x:y
const int MAX = 200005;
struct Tree{
    int left; int right; int data;
}tr[MAX*3];
int n,m,s[MAX],a,b;
char cmd;
void build(int l,int r,int pos){
    tr[pos].left = l;
    tr[pos].right = r;
    if(l == r){
        tr[pos].data = s[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(l,mid,(pos<<1));
    build(mid+1,r,(pos<<1)+1);
    tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
void Update(int l,int r,int pos){
    if(l == r){
        tr[pos].data = b; return
    }
    int mid = (l + r) >> 1;
    if(a <= mid)    {
        Update(l,mid,pos<<1);
    }else if (a > mid){
        Update(mid+1,r,(pos<<1)+1);
    } 
    tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
int Query(int sta,int end,int pos){
    if(tr[pos].left == sta && tr[pos].right == end)
        return tr[pos].data;
    int mid = (tr[pos].left + tr[pos].right)>>1;
    if(end <= mid){
        return Query(sta,end,pos<<1);
    }
    else if(sta > mid){
        return Query(sta,end,(pos<<1)+1);
    }else{
        int x = Query(sta,mid,pos<<1);
        int y = Query(mid+1,end,(pos<<1)+1);
        return max(x,y);
    }
}
int main(){
    int n,m,i,temp;
    char cmd;
    while(~scanf("%d%d",&n,&m)){
        for(i=1;i<=n;i++)
            scanf("%d",&s[i]);
        build(0,n,1);
        for(i = 0;i < m;++i){
            getchar();
            scanf("%c %d %d",&cmd,&a,&b);
            if(cmd == 'Q')
                printf("%d\n",Query(a,b,1));
            else
                Update(0,n,1);
        }
    }
}

posted @ 2011-08-22 16:36  nulle  阅读(196)  评论(0)    收藏  举报