Cod sursa(job #2013780)

Utilizator victoreVictor Popa victore Data 22 august 2017 13:30:29
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<cstdio>
#include<algorithm>

using namespace std;

const int nmax=((100005)<<2);

bool lazy[nmax];

struct al
{
    int st,dr,all;
}arb[nmax];
int type,x,y;

inline void process(int node,int st,int dr)
{
    if(lazy[node] == 2)
    {
        int med=((dr-st)>>1)+st;
        arb[node<<1].st=arb[node<<1].dr=arb[node<<1].all=med-st+1;
        arb[node<<1|1].st=arb[node<<1|1].dr=arb[node<<1|1].all=dr-med;
        lazy[node<<1] = lazy[node<<1|1] = 1;
    }
    else
    {
        arb[node<<1].st=arb[node<<1].dr=arb[node<<1].all=0;
        arb[node<<1|1].st=arb[node<<1|1].dr=arb[node<<1|1].all=0;
        lazy[node<<1] = lazy[node<<1|1] = 2;
    }
}

inline void update(int node,int st,int dr)
{
    if(x <= st && dr <=y)
    {
        if(type == 1)
        {
            arb[node].all=arb[node].st=arb[node].dr=0;
            lazy[node]=1;
        }
        else
        {
            arb[node].all=arb[node].st=arb[node].dr=dr-st+1;
            lazy[node]=2;
        }
        return;
    }
    if(lazy[node])
        process(node,st,dr);
    int med=((dr-st)>>1) + st;
    if(x <= med)
        update(node<<1 , st,med);
    if(y>med)
        update(node<<1|1,med+1,dr);
    arb[node].all = max(arb[node<<1].all , max( arb[node<<1|1].all , arb[node<<1].dr + arb[node<<1|1].st ));
    if(arb[node<<1].st == med-st+1)
        arb[node].st=med-st+1 + arb[node<<1|1].st;
    else
        arb[node].st=arb[node<<1].st;
    if(arb[node<<1|1].dr == dr-med)
        arb[node].dr=dr - med + arb[node<<1].dr;
    else
        arb[node].dr=arb[node<<1|1].dr;
}

inline void init(int node,int st,int dr)
{
    if(st == dr)
    {
        arb[node].all=arb[node].st=arb[node].dr=1;
        return;
    }
    int med = ((dr-st)>>1) + st;
    init(node<<1 , st , med);
    init(node<<1|1 , med+1 , dr);
    arb[node].all = max(arb[node<<1].all , max( arb[node<<1|1].all , arb[node<<1].dr + arb[node<<1|1].st ));
    if(arb[node<<1].st == arb[node<<1].all)
        arb[node].st=arb[node<<1].all + arb[node<<1|1].st;
    else
        arb[node].st=arb[node<<1].st;
    if(arb[node<<1|1].dr == arb[node<<1|1].all)
        arb[node].dr=arb[node<<1|1].all + arb[node<<1].dr;
    else
        arb[node].dr=arb[node<<1|1].dr;
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int n,i,q;
    scanf("%d%d",&n,&q);
    init(1,1,n);
    for(i=1;i<=q;++i)
    {
        scanf("%d",&type);
        if(type == 3)
            printf("%d\n",arb[1].all);
        else
        {
            scanf("%d%d",&x,&y);
            y=x+y-1;
            update(1,1,n);
        }
    }
}