HDU 1754 线段树

Posted on 2011-08-10 07:57  continue_n  阅读(123)  评论(0)    收藏  举报

#include <stdio.h>
typedef struct
NODE {
    int
lc,rc;
    int
grade;
    int
first,mid,tail;
}
node;

node s[600005];
int
gra[200005];

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

void
Maketree(int first,int tail,int at){
    s[at].first = first;
    s[at].tail = tail;
    if
( first == tail )
        s[at].grade = gra[first];
    else
{
        s[at].lc = at*2;
        s[at].rc = at*2+1;
        s[at].mid = (first+tail) / 2;
        Maketree(first,s[at].mid,s[at].lc);
        Maketree(s[at].mid+1,tail,s[at].rc);
        s[at].grade = Max( s[s[at].lc].grade , s[s[at].rc].grade);
    }
}

int
Query(int first,int tail,int at){
    int
l,r;
    if
( s[at].first == first && s[at].tail == tail )
        return
s[at].grade;
    if
( first > s[at].mid ) return Query(first,tail,s[at].rc);
    else if
( tail < s[at].mid+1 ) return Query(first,tail,s[at].lc);
    else
{
        l = Query(first , s[at].mid , s[at].lc);
        r = Query(s[at].mid+1 , tail , s[at].rc);
        return
l > r ? l : r ;
    }
}

void
Updata(int i,int grade,int at){
    if
( s[at].first == s[at].tail ){
        s[at].grade = grade;
    }

    else
{
        if
( i <= s[at].mid ){
            Updata(i,grade,s[at].lc);
        }

        else
Updata(i,grade,s[at].rc);
        s[at].grade = Max( s[s[at].lc].grade , s[s[at].rc].grade );
    }
}


int
main(){
    int
n,m,i,a,b;
    char
c;
    while
(scanf("%d%d",&n,&m)!=EOF){
        for
( i = 1 ; i <= n ; i++){
            scanf("%d",&gra[i]);
        }

        Maketree(1,n,1);
        while
(m--){

getchar();
            scanf("%c%d%d",&c,&a,&b);
            if
( c == 'Q' ) printf("%d\n",Query(a,b,1));
            if
( c == 'U' ) Updata(a,b,1);
        }
    }

    return
0;
}

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3