hdu 1754 I Hate It

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int MAXN = 200005;
int mark[MAXN << 2];

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

void Max(int rt)
{
    mark[rt] = max( mark[rt << 1], mark[(rt << 1) + 1] );   //开始用 rt << 1 | 1 超时了
}

void build(int l, int r, int rt)
{
    if(l == r)
    {
        scanf("%d", &mark[rt]);
        return;
    }
    int mid = (l + r) >> 1;
    build( l, mid, rt << 1);
    build( mid + 1, r, (rt << 1) + 1);
    Max(rt);
}

void update( int n, int score, int l, int r, int rt)
{
    if(l == r )
    {
        mark[rt] = score;
        return;
    }
    int mid = ( l + r) >> 1;
    if(n <= mid)
        update( n, score, l, mid, rt << 1);
    if(n > mid)
        update( n, score, mid + 1, r, (rt << 1) + 1);
    Max(rt);
}

int query(int ll, int rr , int l ,int r, int rt)
{
    if(ll <= l && rr >= r)
    {
        return mark[rt];
    }
    int mid = ( l + r ) >> 1;
    int m = 0;
    if( ll <= mid)
        m = max( m, query(ll, rr, l, mid, rt << 1));
    if( rr > mid)
        m = max( m, query(ll, rr, mid + 1, r, (rt << 1) + 1));
    return m;
}

int main()
{
    int N,M,A,B;
    char ch;
    while(~scanf("%d %d",&N,&M))
    {
        build(1, N, 1);
        for(int i = 0; i< M; i++)
        {
            scanf("%*c%c%d %d",&ch,&A,&B);
            if(ch == 'U')
                update(A,B,1,N,1);
            else
                printf("%d\n",query(A,B,1,N,1));
        }
    }
}

 

posted @ 2015-07-17 23:57  杨永华  阅读(119)  评论(0编辑  收藏  举报