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));

        }

    }

}

 

你可能感兴趣的:(HDU)