Cod sursa(job #2909395)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 13 iunie 2022 11:45:26
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int NMAX=(1<<18);

int lung[NMAX], lungst[NMAX], lungdr[NMAX],a,b;

void aint(int p, int st, int dr)
{
    int mij;
    lung[p]=lungst[p]=lungdr[p]=dr-st+1;
    if(st==dr)
        return;
    mij=(st+dr)/2;
    aint(2*p,st,mij);
    aint(2*p+1,mij+1,dr);
}

void update(int p, int st, int dr, bool ok)
{
    int mij;
    if(st==dr)
    {
        if(ok==1)
            lung[p]=lungst[p]=lungdr[p]=0;
        else
            lung[p] =lungst[p] =lungdr[p]=dr-st+1;
        return;
    }
    mij=(st+dr)/2;
    if (lung[p] == dr-st+1)
    {
        lung[2*p] =lungst[2*p] =lungdr[2*p]=mij-st+1;
        lung[2*p+1] =lungst[2*p+1] =lungdr[2*p+1]=dr-mij;
    }
    if (lung[p]==0)
    {
        lung[2*p]=lungst[2*p]=lungdr[2*p]=0;
        lung[2*p+1]=lungst[2*p+1]=lungdr[2*p+1]=0;
    }
    if(a<= st && dr<=b)
    {
        if(ok==1)
            lung[p]=lungst[p]=lungdr[p]=0;
        else
            lung[p] =lungst[p] =lungdr[p]=dr-st+1;
        return;
    }
    if(a<=mij)
        update(2*p,st,mij,ok);
    if(b>mij)
        update(2*p+1,mij+1,dr,ok);
    if(lung[2*p]==mij-st+1)
        lungst[p]=mij-st+1+lungst[2*p+1];
    else
        lungst[p]=lungst[2*p];
    if(lung[2*p+1]==dr-mij)
        lungdr[p]=dr-mij+lungdr[2*p];
    else
        lungdr[p]=lungdr[2*p+1];
    lung[p]=max(lung[2*p],max(lung[2*p+1],lungdr[2*p]+lungst[2*p+1]));
}

int main()
{
    int n,i,j,p,c,st,dr;
    long long kon;
    fin>>n>>p;
    aint(1,1,n);
    for(i=1;i<=p;i++)
    {
        fin>>c;
        if(c==1 || c==2)
        {
            fin>>a>>b;
            b=a+b-1;
            if(c==1)
                update(1,1,n,1);
            else
                update(1,1,n,0);
        }
        else
        {
            kon=lung[1];
            fout<<kon<<"\n";
        }
    }
    return 0;
}