Cod sursa(job #1400233)

Utilizator iarbaCrestez Paul iarba Data 25 martie 2015 10:28:20
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <cstdio>
using namespace std;
int maxi[400001],lefti[400001],righti[400001],lu[400001];
int x,y,n,m,caz;
int maxim(int x, int y){if(x>y)return x;return y;}
void update2(int x, int y, int z);
void update1(int nod, int left, int right)
{
    if((x<=left)&&(right<=y))
    {
        maxi[nod]=0;
        lefti[nod]=0;
        righti[nod]=0;
        lu[nod]=1;
        return ;
    }
    int piv=(left+right)/2;
    if(lu[nod]==2)
    {
        int aux1=x, aux2=y;
        lu[nod]=0;
        x=left;y=right;
        update2(2*nod,left,piv);
        update2(2*nod+1,piv+1,right);
        x=aux1;y=aux2;
    }
    if(x<=piv){update1(2*nod,left,piv);}
    if(piv<y){update1(2*nod+1,piv+1,right);}
    if(lefti[2*nod]==piv-left+1){lefti[nod]=piv-left+1+lefti[2*nod+1];}else{lefti[nod]=lefti[2*nod];}
    if(righti[2*nod+1]==right-piv){righti[nod]=right-piv+righti[2*nod];}else{righti[nod]=righti[2*nod+1];}
    maxi[nod]=maxim(maxim(maxi[2*nod],maxi[2*nod+1]),righti[2*nod]+lefti[2*nod+1]);
}
void update2(int nod, int left, int right)
{
    if((x<=left)&&(right<=y))
    {
        maxi[nod]=right-left+1;
        lefti[nod]=right-left+1;
        righti[nod]=right-left+1;
        lu[nod]=2;
        return ;
    }
    int piv=(left+right)/2;
    if(lu[nod]==1)
    {
        lu[nod]=0;
        int aux1=x, aux2=y;
        x=left;y=right;
        update1(2*nod,left,piv);
        update1(2*nod+1,piv+1,right);
        x=aux1;y=aux2;
    }
    if(x<=piv){update2(2*nod,left,piv);}
    if(piv<y){update2(2*nod+1,piv+1,right);}
    if(lefti[2*nod]==piv-left+1){lefti[nod]=piv-left+1+lefti[2*nod+1];}else{lefti[nod]=lefti[2*nod];}
    if(righti[2*nod+1]==right-piv){righti[nod]=right-piv+righti[2*nod];}else{righti[nod]=righti[2*nod+1];}
    maxi[nod]=maxim(maxim(maxi[2*nod],maxi[2*nod+1]),righti[2*nod]+lefti[2*nod+1]);
}
int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&m);
    x=1;
    y=n;
    update2(1,1,n);
    while(m--)
    {
        scanf("%d",&caz);
        if(caz==1)
        {
            scanf("%d%d",&x,&y);
            y=x+y-1;
            update1(1,1,n);
        }
        if(caz==2)
        {
            scanf("%d%d",&x,&y);
            y=x+y-1;
            update2(1,1,n);
        }
        if(caz==3)
        {
            printf("%d\n",maxi[1]);
        }
    }
return 0;
}