Cod sursa(job #1845763)

Utilizator silkMarin Dragos silk Data 11 ianuarie 2017 21:11:36
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <algorithm>
#define NMax 400000
using namespace std;

int Q[NMax+1];
int M[NMax+1];
int L[NMax+1];
int R[NMax+1];
int N,n;

inline void In(int p)
{
    L[2*p] = R[2*p] = M[2*p] = 0;
    L[2*p+1] = R[2*p+1] = M[2*p+1] = 0;
}

inline void Out(int p)
{
    L[2*p] = R[2*p] = M[2*p] = Q[2*p];
    L[2*p+1] = R[2*p+1] = M[2*p+1] = Q[2*p+1];
}

void Modify(int p)
{
    R[p] = R[2*p+1];
    if(Q[2*p+1] == R[2*p+1]) R[p] = R[p] + R[2*p];
    L[p] = L[2*p];
    if(Q[2*p] == L[2*p]) L[p] = L[p] + L[2*p+1];
    M[p] = max(M[2*p], max(M[2*p+1], L[2*p+1] + R[2*p]));
}

void Update_in(int p, int x, int y, int st, int dr)
{
    if(x==st && y==dr)
    {
        L[p] = R[p] = M[p] = 0;
        return;
    }

    if(!M[p]) In(p);
    if(M[p]==Q[p]) Out(p);

    int m = (st+dr)/2;
    if(y <= m) Update_in(2*p,x,y,st,m);
    else if(m < x) Update_in(2*p+1,x,y,m+1,dr);
    else { Update_in(2*p,x,m,st,m); Update_in(2*p+1,m+1,y,m+1,dr); }
    Modify(p);
}

void Update_out(int p, int x, int y, int st, int dr)
{
    if(x==st && y==dr)
    {
        L[p] = R[p] = M[p] = Q[p];
        return;
    }

    if(!M[p]) In(p);
    if(M[p]==Q[p]) Out(p);

    int m = (st+dr)/2;
    if(y <= m) Update_out(2*p,x,y,st,m);
    else if(m < x) Update_out(2*p+1,x,y,m+1,dr);
    else { Update_out(2*p,x,m,st,m); Update_out(2*p+1,m+1,y,m+1,dr); }
    Modify(p);
}

void Build()
{
    int i;
    for(i = N; i < N+n; ++i) Q[i] = M[i] = R[i] = L[i] = 1;
    for(i = N-1; i >= 1; --i) M[i] = Q[i] = R[i] = L[i] = M[2*i] + M[2*i+1];
}

int main(){
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    int P,x,y,c;

    scanf("%d %d",&n,&P);
    for(N=1; N < n; N*=2);
    Build();

    while(P--)
    {
        scanf("%d",&c);
        if(c==1){
            scanf("%d %d",&x,&y);
            Update_in(1,x,x+y-1,1,N);
        }
        else if(c==2){
            scanf("%d %d",&x,&y);
            Update_out(1,x,x+y-1,1,N);
        }
        else printf("%d\n",M[1]);
    }


return 0;
}