Cod sursa(job #3347741)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 18 martie 2026 09:50:41
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream  fin("hotel.in");
ofstream fout("hotel.out");
int N,P,lazy[4*NMAX];

struct node
{
    int pref,suff,best,len;
} aint[4*NMAX];

node combine(node L, node R)
{
    node T;

    T.len=L.len+R.len;
    T.best=max(max(L.best,R.best),L.suff+R.pref);

    if(L.pref==L.len)
    {
        T.pref=L.len+R.pref;
    }
    else
    {
        T.pref=L.pref;
    }

    if(R.suff==R.len)
    {
        T.suff=L.suff+R.len;
    }
    else
    {
        T.suff=R.suff;
    }

    return T;
}

void modificare(int nod, int val)
{
    if(!val)
    {
        aint[nod].pref=aint[nod].suff=aint[nod].best=0;
    }
    else
    {
        aint[nod].pref=aint[nod].suff=aint[nod].best=aint[nod].len;
    }
    lazy[nod]=val;
}

void propagate(int nod)
{
    if(lazy[nod]!=-1)
    {
        modificare(2*nod,lazy[nod]);
        modificare(2*nod+1,lazy[nod]);
        lazy[nod]=-1;
    }
}

void build(int nod, int st, int dr)
{
    lazy[nod]=-1;
    aint[nod].len=dr-st+1;

    if(st==dr)
    {
        aint[nod].pref=aint[nod].suff=aint[nod].best=1;
        return;
    }

    int pmijl=(st+dr)/2;
    build(2*nod,st,pmijl);
    build(2*nod+1,pmijl+1,dr);
    aint[nod]=combine(aint[2*nod],aint[2*nod+1]);
}

void update(int nod, int st, int dr, int l, int r, int val)
{
    if(st>r || dr<l)
    {
        return;
    }

    if(l<=st && dr<=r)
    {
        modificare(nod,val);
        return;
    }

    propagate(nod);

    int pmijl=(st+dr)/2;
    update(2*nod,st,pmijl,l,r,val);
    update(2*nod+1,pmijl+1,dr,l,r,val);
    aint[nod]=combine(aint[2*nod],aint[2*nod+1]);
}


int main()
{
    fin>>N>>P;

    build(1,1,N);

    int op,poz,M;
    for(int q=1; q<=P; q++)
    {
        fin>>op;

        if(op==1)
        {
            fin>>poz>>M;
            update(1,1,N,poz,poz+M-1,0);
        }

        if(op==2)
        {
            fin>>poz>>M;
            update(1,1,N,poz,poz+M-1,1);
        }

        if(op==3)
        {
            fout<< aint[1].best << "\n";
        }
    }

    return 0;
}