http://acm.hdu.edu.cn/showproblem.php?pid=1166

(1)纯属敲模版,没有什么特别的。错了两次:一次是TLE,原因是输出了不该输出的(测试用的,忘了删掉);另一次WA,原因是没有输出该输出的(cas)。

具体代码:

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
const int N=300000;
int data[N], Max[N<<2];
int n, m;
void pushup(int rt)
{
    Max[rt]=max(Max[rt<<1], Max[rt<<1|1]);
}
void build(int l, int r, int rt)
{
    if(l==r)
    {
        scanf("%d", &data[l]);
        Max[rt]=data[l];
        return ;
    }
    int m=l+r>>1;
    build(lson);
    build(rson);
    pushup(rt);
}
int query(int L, int R, int l, int r, int rt)
{
    if(L<=l&&r<=R)
        return Max[rt];
    int m=l+r>>1;
    int ret=0;
    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 val, int l, int r, int rt)
{
    if(l==r)
    {
        data[l]=val;
        Max[rt]=data[l];
        return ;
    }
    int m=l+r>>1;
    if(p<=m) update(p, val, lson);
    else update(p, val, rson);
    pushup(rt);
}
int main()
{
    int i, j;
    int a, b;
    char ch;
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        build(1, n, 1);
        for(i=1;i<=m;i++)
        {
            scanf(" %c%d%d", &ch, &a, &b);
            if(ch=='Q')
            {
                printf("%d\n", query(a, b, 1, n, 1));
            }
            else
            {
                update(a, b, 1, n, 1);
            }
        }
    }
    return 0;
}