Cod sursa(job #2150665)

Utilizator DavidLDavid Lauran DavidL Data 3 martie 2018 18:17:05
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#define MAX 100005
using namespace std;
ifstream fi("hotel.in");
ofstream fo("hotel.out");

int A[4*MAX],B[4*MAX],C[4*MAX];
bool lazy[4*MAX];
int n,p;
int st,dr;

void build(int nod,int l,int r)
{
    A[nod]=B[nod]=C[nod]=r-l+1;
    if (l==r)
        return;
    int mij=(l+r)/2;
    build(2*nod,l,mij);
    build(2*nod+1,mij+1,r);
}

void update(int nod,int l,int r,int tip)
{
    if (st<=l && r<=dr)
    {
        if (tip==1)
            A[nod]=B[nod]=C[nod]=0;
        else
            A[nod]=B[nod]=C[nod]=r-l+1;
        lazy[nod]=1;
        return;
    }

    int mij=(l+r)/2;

    if (lazy[nod])
    {
        if (A[nod]!=0)
            A[2*nod]=B[2*nod]=C[2*nod]=mij-l+1;
        else
            A[2*nod]=B[2*nod]=C[2*nod]=0;
        if (A[nod]!=0)
            A[2*nod+1]=B[2*nod+1]=C[2*nod+1]=r-mij;
        else
            A[2*nod+1]=B[2*nod+1]=C[2*nod+1]=0;
        lazy[nod]=0;
        lazy[2*nod]=lazy[2*nod+1]=1;
    }

    if (st<=mij)
        update(2*nod,l,mij,tip);
    if (dr>mij)
        update(2*nod+1,mij+1,r,tip);

    A[nod]=max(max(A[2*nod],A[2*nod+1]),C[2*nod]+B[2*nod+1]);
    B[nod]=B[2*nod];
    if (B[2*nod]==mij-l+1)
        B[nod]+=B[2*nod+1];
    C[nod]=C[2*nod+1];
    if (C[2*nod+1]==r-mij)
        C[nod]+=C[2*nod];
}

int main()
{
    fi>>n>>p;
    A[1]=B[1]=C[1]=n;
    lazy[1]=1;
    while (p--)
    {
        int P,a,b;
        fi>>P;
        if (P==1)
        {
            fi>>a>>b;
            st=a,dr=a+b-1;
            update(1,1,n,1);
        }
        else if (P==2)
        {
            fi>>a>>b;
            st=a,dr=a+b-1;
            update(1,1,n,-1);
        }
        else
        {
            fo<<A[1]<<"\n";
        }
    }

    return 0;
}