Cod sursa(job #3165975)

Utilizator MateiCatalinUrsache Matei MateiCatalin Data 7 noiembrie 2023 12:18:40
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <fstream>

using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

int n,p,x,y,val;
int aib[800001],r[800001],l[800001],lazy[800001];

void constructie(int st,int dr,int nod)
{
    aib[nod]=dr-st+1;
    r[nod]=st;
    l[nod]=dr;
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    constructie(st,mij,nod*2);
    constructie(mij+1,dr,nod*2+1);
}

void update(int st,int dr,int nod)
{
    if(lazy[nod]!=0)
    {
        if(lazy[nod]==1)
        {
            aib[nod]=0;
            r[nod]=dr+1;
            l[nod]=st-1;
            lazy[nod*2]=1;
            int mij=(dr+st)/2;
            l[nod*2]=st-1;
            r[nod*2]=mij+1;
            lazy[nod*2+1]=1;
            l[nod*2+1]=mij;
            r[nod*2+1]=dr+1;
        }
        else
        {
            aib[nod]=dr-st+1;
            r[nod]=st;
            l[nod]=dr;
            lazy[nod*2]=-1;
            int mij=(st+dr)/2;
            l[nod*2]=mij;
            r[nod*2]=st;
            lazy[nod*2+1]=-1;
            l[nod*2+1]=dr;
            r[nod*2+1]=mij+1;
        }
        lazy[nod]=0;
    }
    if(st>y || dr<x)
        return;
    if(st>=x && dr<=y)
    {
        if(val==-1)
        {
            aib[nod]=dr-st+1;
            r[nod]=st;
            l[nod]=dr;
            lazy[nod*2]=-1;
            int mij=(st+dr)/2;
            l[nod*2]=mij;
            r[nod*2]=st;
            lazy[nod*2+1]=-1;
            l[nod*2+1]=dr;
            r[nod*2+1]=mij+1;
        }
        else
        {
            aib[nod]=0;
            r[nod]=dr+1;
            l[nod]=st-1;
            lazy[nod*2]=1;
            int mij=(dr+st)/2;
            l[nod*2]=st-1;
            r[nod*2]=mij+1;
            lazy[nod*2+1]=1;
            l[nod*2+1]=mij;
            r[nod*2+1]=dr+1;
        }
        return;
    }
    int mij=(dr+st)/2;
    update(st,mij,nod*2);
    update(mij+1,dr,nod*2+1);
    aib[nod]=max(aib[nod*2],aib[nod*2+1]);
    aib[nod]=max(aib[nod],l[nod*2+1]-r[nod*2]+1);
    if (aib[nod*2+1]==dr-mij)
        r[nod]=r[nod*2];
    else
        r[nod]=r[nod*2+1];
    if (aib[nod*2]==mij+1-st)
        l[nod]=l[nod*2+1];
    else
        l[nod]=l[nod*2];
}



int main()
{
    f>>n>>p;
    constructie(1,n,1);
    for(int q=1;q<=p;q++)
    {
        int c;
        f>>c;
        if(c==1)
        {
            f>>x>>y;
            y+=x-1;
            val=1;
            update(1,n,1);
        }
        if(c==2)
        {
            f>>x>>y;
            y+=x-1;
            val=-1;
            update(1,n,1);
        }
        if(c==3)
            g<<aib[1]<<'\n';
    }
    return 0;
}