[置顶] 【置顶】我以后一定要好好看题!!!!!!!!!

QUSTOJ 1713 ,一道很简单的题,我...题看错了(没看见最开始的多组数据!!)卧槽!为此我耽误了一个半小时!!!!!!下次必须看题!!真心不爽!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

(第一名就这么丢了,xxxxxxxxxx)

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

int node[20000000]= {0};

int require(int targetleft,int targetright,int cnode,int leftbound,int rightbound)
{
    if(targetleft<=leftbound&&targetright>=rightbound)
    {
        return node[cnode];
    }
    if(targetright<leftbound||targetleft>rightbound)
    {
        return 0;
    }
    int a=require(targetleft,targetright,cnode*2+1,leftbound,(rightbound+leftbound)/2);
    int b=require(targetleft,targetright,cnode*2+2,(leftbound+rightbound)/2+1,rightbound);
    return max(a,b);
}

void special(int q)
{
    /// n==1
    int x=0;
    scanf("%d",&x);
    for(int i=0; i<q; i++)
    {
        char c[4];
        c[0]=c[1]=c[2]=c[3]=0;
        int a,b;
        scanf("%s %d %d",c,&a,&b);
        switch(c[0])
        {
        case 'Q':
            printf("%d\n",x);
            break;
        case 'U':
            x=b;
            break;
        }
    }
}

int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)==2)
    {
        memset(node,0,20000000);

        if(n==1)
        {
            special(m);
            ///printf("XXXX\n");
            return 0;
        }

        int realn=1;
        while(realn<n) realn*=2;
        for(int k=realn-1; k<=realn+n-2; k++)
        {
            scanf("%d",&node[k]);
        }
        /// build tree
        int lastcur=realn;
        int cur=lastcur/2-1;
        while(cur>0)
        {
            for(int toadd=0; toadd<cur+1; toadd++)
            {
                node[cur+toadd]=max(node[2*(cur+toadd)+1],node[2*(cur+toadd)+2]);
            }
            lastcur=cur+1;
            cur=lastcur/2-1;
        }
        node[0]=max(node[1],node[2]);
        for(int query=0; query<m; query++)
        {
            char c[4];
            c[0]=c[1]=c[2]=c[3]=0;
            int a,b;
            scanf("%s %d %d",c,&a,&b);
            switch(c[0])
            {
            case 'U':
            {
                node[realn-1+a-1]=b;
                int cnt=(realn-1+a-1-1)/2;
                while(cnt>0)
                {
                    node[cnt]=max(node[cnt*2+1],node[cnt*2+2]);
                    cnt=(cnt-1)/2;
                }
                node[0]=max(node[1],node[2]);
            }
            break;
            case 'Q':
            {
                if(a==b)
                {
                    printf("%d\n",node[realn-1+a-1]);
                }
                else
                {
                    if(b<a)
                    {
                        int tmp=a;
                        a=b;
                        b=tmp;
                    }
                    int ans=require(a-1,b-1,0,0,realn-1);
                    printf("%d\n",ans);
                }
            }
            break;
            default:
                printf("ERROR\n");
            }/// end of switch
        }
    }
    return 0;
}


你可能感兴趣的:([置顶] 【置顶】我以后一定要好好看题!!!!!!!!!)