hdu 1754

/*
ID:billat11
LANG:C
TASK:namenum
*/
#include<iostream>
#include<cstdio>
#include<cstdarg>
#include<stdlib.h>
#include<cstring>
#include<cmath>
using namespace std;
const int N=200005;
struct Node
{
    int left;
    int right;
    int maxScore;
    int score;
}allNode[4*N];
int data[N+5];
inline int max(int a,int b){  //加了inline速度快了好多,orz~~~
    return a>b?a:b;
}
void build(int l,int r,int n)
{
    if(l==r)//leaf node
    {
        allNode[n].left=l;
        allNode[n].right=r;
        allNode[n].maxScore=allNode[n].score=data[l];
    }
    else//not leaf node
    {
        int mid=(l+r)>>1;
        allNode[n].left=l;
        allNode[n].right=r;
        build(l,mid,2*n);
        build(mid+1,r,2*n+1);
        allNode[n].maxScore=max(allNode[2*n].maxScore,allNode[2*n+1].maxScore);
    }
}
void print(int l,int r,int n)
{
    if(l==r)
    {
        printf("left:%d right:%d  max:%d\n",l,r,allNode[n].maxScore);
    }
    else
    {
        int mid=(l+r)>>1;
        print(l,mid,2*n);
        print(mid+1,r,2*n+1);
        printf("left:%d right:%d  max:%d\n",l,r,allNode[n].maxScore);
    }
}
int query(int l,int r,int n)
{
    int mid=(allNode[n].left+allNode[n].right)>>1;
    if((allNode[n].left==l)&&(allNode[n].right==r))
        return allNode[n].maxScore;
    else
    {
        if((r<=mid)&&(l>=allNode[n].left))
            return query(l,r,2*n);
        else if((l>mid)&&(r<=allNode[n].right))
            return query(l,r,2*n+1);
        else if((l<=mid)&&(r>mid))
         return max(query(l,mid,2*n),query(mid+1,r,2*n+1));
    }
}
void update(int n,int d,int alln)
{
    int mid=(allNode[alln].left+allNode[alln].right)>>1;
    
    if((allNode[alln].left==n)&&(allNode[alln].right==n))
    {
        allNode[alln].maxScore=d;
        int newn=alln>>1;
        while(newn>=1)
        {
            allNode[newn].maxScore=max(allNode[2*newn].maxScore,allNode[2*newn+1].maxScore);
            newn=newn>>1;
        }
    }
    else
    {
        if(n<=mid) 
            update(n,d,2*alln);
        else if(n>mid)
            update(n,d,2*alln+1);
    }
     /*
     if(allNode[alln].left==allNode[alln].right)
     {
         allNode[alln].maxScore=d;
     }
     else
     {
         if(n<=mid) 
            update(n,d,2*alln);
        else if(n>mid)
            update(n,d,2*alln+1);
        allNode[alln].maxScore=max(allNode[2*alln].maxScore,allNode[2*alln+1].maxScore);
     }
      * */
}
int main()
{
    int n,m;
    char op;
    while(scanf("%d %d",&n,&m)==2)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&data[i]);
        build(1,n,1);
        //print(1,n,1);
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("\n%c%d%d",&op,&l,&r);
            if(op=='Q')
            {
                int ans=query(l,r,1);
                printf("%d\n",ans);
            }
            else if(op=='U')
            {
                update(l,r,1);
            }
            
        }
        
    }
  //system("pause");
  return 0;
}

  

posted @ 2012-06-10 15:48  wuzhibin  阅读(287)  评论(0)    收藏  举报