Cod sursa(job #1181651)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 3 mai 2014 14:06:26
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int p[3*Nmax],vall[3*Nmax],stt[3*Nmax],drr[3*Nmax];

inline void Build(int nod, int st, int dr)
{
    if(st==dr)
    {
        vall[nod]=stt[nod]=drr[nod]=1;
        p[nod]=-1;
        return;
    }
    int mij=(st+dr)/2;
    Build(2*nod,st,mij);
    Build(2*nod+1,mij+1,dr);
    p[nod]=-1;
    stt[nod]=stt[2*nod];
    if(stt[2*nod]==mij-st+1)
        stt[nod]+=stt[2*nod+1];
    drr[nod]=drr[2*nod+1];
    if(drr[2*nod+1]==dr-mij)
        drr[nod]+=drr[2*nod];
    vall[nod]=max(vall[2*nod],max(vall[2*nod+1],drr[2*nod]+stt[2*nod+1]));
}

inline void Update(int nod, int st, int dr, int x, int y, int val)
{
    if(st==x && y==dr)
    {
        if(!val)
        {
            vall[nod]=stt[nod]=drr[nod]=dr-st+1;
            p[nod]=0;
        }
        else
        {
            vall[nod]=stt[nod]=drr[nod]=0;
            p[nod]=1;
        }
        return;
    }
    int mij=(st+dr)/2;
    if(!p[nod])
    {
        vall[2*nod]=stt[2*nod]=drr[2*nod]=mij-st+1;
        vall[2*nod+1]=stt[2*nod+1]=drr[2*nod+1]=dr-mij;
        p[2*nod]=p[2*nod+1]=0; p[nod]=-1;
    }
    else
        if(p[nod]==1)
        {
            vall[2*nod]=stt[2*nod]=drr[2*nod]=0;
            vall[2*nod+1]=stt[2*nod+1]=drr[2*nod+1]=0;
            p[2*nod]=p[2*nod+1]=1; p[nod]=-1;
        }
    if(y<=mij)
        Update(2*nod,st,mij,x,y,val);
    else
        if(x>mij)
            Update(2*nod+1,mij+1,dr,x,y,val);
        else
        {
            Update(2*nod,st,mij,x,mij,val);
            Update(2*nod+1,mij+1,dr,mij+1,y,val);
        }
    stt[nod]=stt[2*nod];
    if(stt[2*nod]==mij-st+1)
        stt[nod]+=stt[2*nod+1];
    drr[nod]=drr[2*nod+1];
    if(drr[2*nod+1]==dr-mij)
        drr[nod]+=drr[2*nod];
    vall[nod]=max(vall[2*nod],max(vall[2*nod+1],drr[2*nod]+stt[2*nod+1]));
}

int main()
{
    int N,M,x,y,z;
    freopen ("hotel.in","r",stdin);
    freopen ("hotel.out","w",stdout);
    scanf("%d%d", &N,&M);
    Build(1,1,N);
    while(M--)
    {
        scanf("%d", &x);
        if(x==3)
            printf("%d\n", vall[1]);
        else
        {
            scanf("%d%d", &y,&z);
            if(x==1)
                Update(1,1,N,y,y+z-1,1);
            else
                Update(1,1,N,y,y+z-1,0);
        }
    }
    return 0;
}