hdu 1754 I Hate It(基础线段树)

#include <stdio.h>

 

#define MAXSIZE 200001

int stu[MAXSIZE];

struct seg_tree
{
    int l,r,max;
};
seg_tree tree[MAXSIZE*3];

inline int Max(int a,int b)
{
    return a>b?a:b;
}

void build(int a,int b,int idx)
{
    tree[idx].l=a;
    tree[idx].r=b;
    if(a==b)
    {
        tree[idx].max=stu[a];
        return;
    }
    int mid=(a+b)/2;
    build(a,mid,idx*2);
    build(mid+1,b,idx*2+1);
    tree[idx].max=Max(tree[idx*2].max,tree[idx*2+1].max);
}

void update(int i,int val,int idx)
{
    if(i==tree[idx].l && tree[idx].r==i)
    {
        tree[idx].max=val;
        return;
    }
    if(i<=tree[idx*2].r) update(i,val,idx*2);
    else update(i,val,idx*2+1);
    tree[idx].max=Max(tree[idx*2].max,tree[idx*2+1].max);
}

int query(int a,int b,int idx)
{
    if(a<=tree[idx].l && tree[idx].r<=b)
    {
        return tree[idx].max;
    }
    if(b<=tree[idx*2].r) return query(a,b,idx*2);
    else if(a>=tree[idx*2+1].l) return query(a,b,idx*2+1);
    else return Max(query(a,tree[idx*2].r,idx*2),query(tree[idx*2+1].l,b,idx*2+1));
}

int main()
{
    int N,M;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        int i,j;
        char ch;
        for(i=1; i<=N; i++)
            scanf("%d",&stu[i]);
        build(1,N,1);
        while(M--)
        {
            getchar();
            scanf("%c %d %d",&ch,&i,&j);
            if(ch=='Q')
            {
                printf("%d\n",query(i,j,1));
            }
            else update(i,j,1);
        }
    }
    return 0;
}

posted @ 2010-08-30 22:41  菜到不得鸟  阅读(260)  评论(0)    收藏  举报