Cod sursa(job #1845737)

Utilizator silkMarin Dragos silk Data 11 ianuarie 2017 20:48:31
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <algorithm>
#define NMax 400000
using namespace std;

int aint[NMax+1];
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)
{
    if( 2*p < N+n ) L[2*p] = R[2*p] = M[2*p] = Q[2*p];
    if( 2*p+1 < N+n ) 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;
        aint[p] = -1;
        return;
    }

    if(aint[p])
    {
        if(aint[p] < 0) In(p);
        else Out(p);
        aint[p] = 0;
    }

    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];
        aint[p] = 1;
        return;
    }

    if(aint[p])
    {
        if(aint[p] < 0) In(p);
        else Out(p);
        aint[p] = 0;
    }

    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] = max(M[2*i], max(M[2*i+1], R[2*i]+L[2*i+1]));
        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;
}