Cod sursa(job #3173274)

Utilizator tudor_costinCostin Tudor tudor_costin Data 22 noiembrie 2023 12:43:34
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.35 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int Nmax=100005;
struct node{
    int maxlen;
    int llen;
    int rlen;
};
node aint[4*Nmax];
int lazy[4*Nmax];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        node x;
        x.maxlen=1;
        x.llen=1;
        x.rlen=1;
        aint[nod]=x;
        return;
    }
    int mid=(st+dr)/2;
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    if(aint[2*nod].llen!=(mid-st+1)) aint[nod].llen=aint[2*nod].llen;
    else aint[nod].llen=aint[2*nod].llen+aint[2*nod+1].llen;
    if(aint[2*nod+1].rlen!=(dr-mid)) aint[nod].rlen=aint[2*nod+1].rlen;
    else aint[nod].rlen=aint[2*nod].rlen+aint[2*nod+1].rlen;
    aint[nod].maxlen=max(aint[2*nod].maxlen,aint[2*nod+1].maxlen);
    aint[nod].maxlen=max(aint[nod].maxlen,aint[2*nod].rlen+aint[2*nod+1].llen);
    return;
}
void update(int nod,int st,int dr,int i,int j,int tip)
{
    if(i<=st && dr<=j)
    {
        if(tip==1)
        {
            aint[nod].maxlen=0;
            aint[nod].llen=0;
            aint[nod].rlen=0;
            lazy[nod]=1;
        }
        else
        {
            aint[nod].maxlen=dr-st+1;
            aint[nod].llen=dr-st+1;
            aint[nod].rlen=dr-st+1;
            lazy[nod]=2;
        }
        ///cout<<nod<<' '<<st<<' '<<dr<<' '<<' '<<aint[nod].llen<<' '<<aint[nod].maxlen<<' '<<aint[nod].rlen<<'\n';
        return;
    }
    int mid=(st+dr)/2;
    if(lazy[nod]==1)
    {
        aint[2*nod].maxlen=aint[2*nod+1].maxlen=0;
        aint[2*nod].llen=aint[2*nod+1].llen=0;
        aint[2*nod].rlen=aint[2*nod+1].rlen=0;
        lazy[2*nod]=1;
        lazy[2*nod+1]=1;
        lazy[nod]=0;
    }
    else if(lazy[nod]==2)
    {
        aint[2*nod].maxlen=aint[2*nod].llen=aint[2*nod].rlen=mid-st+1;
        aint[2*nod+1].maxlen=aint[2*nod+1].llen=aint[2*nod+1].rlen=dr-mid;
        lazy[2*nod]=2;
        lazy[2*nod+1]=2;
        lazy[nod]=0;
    }
    if(j<=mid) update(2*nod,st,mid,i,j,tip);
    else if(i>mid) update(2*nod+1,mid+1,dr,i,j,tip);
    else
    {
        update(2*nod,st,mid,i,mid,tip);
        update(2*nod+1,mid+1,dr,mid+1,j,tip);
    }
    if(aint[2*nod].llen!=(mid-st+1)) aint[nod].llen=aint[2*nod].llen;
    else aint[nod].llen=aint[2*nod].llen+aint[2*nod+1].llen;
    if(aint[2*nod+1].rlen!=(dr-mid)) aint[nod].rlen=aint[2*nod+1].rlen;
    else aint[nod].rlen=aint[2*nod].rlen+aint[2*nod+1].rlen;
    aint[nod].maxlen=max(aint[2*nod].maxlen,aint[2*nod+1].maxlen);
    aint[nod].maxlen=max(aint[nod].maxlen,aint[2*nod].rlen+aint[2*nod+1].llen);
    ///cout<<nod<<' '<<st<<' '<<dr<<' '<<' '<<aint[nod].llen<<' '<<aint[nod].maxlen<<' '<<aint[nod].rlen<<'\n';
    return;

}
int main()
{
    int n,p,c,j,m;
    fin>>n>>p;
    build(1,1,n);
    for(int i=1;i<=p;i++)
    {
        fin>>c;
        if(c==3)
        {
            fout<<aint[1].maxlen<<'\n';
        }
        else
        {
            if(c==1)
            {
                fin>>j>>m;
                update(1,1,n,j,j+m-1,1);
                ///fout<<aint[1].maxlen<<'\n';
            }
            if(c==2)
            {
                fin>>j>>m;
                update(1,1,n,j,j+m-1,2);
                ///fout<<aint[1].maxlen<<'\n';
            }
        }
    }
    return 0;
}