HDOJ 1754 I Hate It(線段樹)

超級傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=1754


分析:用線段樹來保存學生成績,每次更新區間最大值即可。


代碼:

#include<cstdio>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 200000;
char cmd[2];
int n, mNum, a, b, max[maxn<<2];
int Max(int x, int y) {
    return (x>y ? x:y);
}
void PushUp(int rt) {
    max[rt] = Max(max[rt<<1], max[rt<<1|1]);
}
void BuildTree(int l, int r, int rt) {
    if (l == r) {
        scanf("%d", &max[rt]);
        return ;
    }
    int m = (l+r)>>1;
    BuildTree(lson);
    BuildTree(rson);
    PushUp(rt);
}
int Query(int L, int R, int l, int r, int rt) {
    if (L<=l && r<=R)
        return max[rt];
    int ret=-1,m=(l+r)>>1;
    if (L <= m)
        ret = Max(ret, Query(L, R, lson));
    if (R > m)
        ret = Max(ret, Query(L, R, rson));
    return ret;
}
void UpDate(int p, int bi, int l, int r, int rt) {
    if (l == r) {
        max[rt] = bi;
        return ;
    }
    int m = (l+r)>>1;
    if (p <= m)
        UpDate(p, bi, lson);
    else
        UpDate(p, bi, rson);
    PushUp(rt);
}
int main() {
    #ifndef ONLINE_JUDGE
       freopen("1.txt","r",stdin);
    #endif
    while (scanf("%d %d", &n, &mNum)>0) {
        BuildTree(1, n, 1);
        for (int i=1; i<=mNum; ++i) {
            scanf("%s%d%d", cmd, &a, &b);
            if (cmd[0] == 'Q')
                printf("%d\n", Query(a, b, 1, n, 1));
            else
                UpDate(a, b, 1, n, 1);
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章