Cod sursa(job #2613666)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 10 mai 2020 14:08:26
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.66 kb
/// BMDesktop
#include <iostream>
#include <fstream>
#define dim 100005
using namespace std;

string nameProb="hotel";
ifstream fin(nameProb+".in");
ofstream fout(nameProb+".out");
int a,b,n,q,tip,i,m;
struct nod
{
    bool val=0;
    int maxx=0,stanga=0,dreapta=0;
    int lazy=0;
} A[dim];
void setval (int nod,int val)
{
    A[nod].stanga=val;
    A[nod].dreapta=val;
    A[nod].maxx=val;
}
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        A[nod].stanga=1;
        A[nod].dreapta=1;
        A[nod].maxx=1;
        return;
    }
    int mid=(st+dr)/2;
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    setval(nod,dr-st+1);
}
void afis(int nod)
{
    cout<<nod<<" "<<A[nod].stanga<<" "<<A[nod].dreapta<<endl;
}

void lazyupdate(int nod,int st,int dr,int lazyval)
{
    int mid=(st+dr)/2;
    A[2*nod].lazy=1;
    A[2*nod+1].lazy=1;
    A[2*nod].val=A[nod].val;
    A[2*nod+1].val=A[nod].val;
    if(lazyval==1)
    {
        setval(2*nod,0);
        setval(2*nod+1,0);
    }
    else
    {
        setval(2*nod,mid-st+1);
        setval(2*nod+1,dr-(mid+1)+1);
    }
}
void cazare(int nod,int st,int dr)
{
    if(dr<a||st>b||st>dr)
        return;
    if(a<=st&&dr<=b)
    {
        A[nod].val=1;
        A[nod].lazy=1;
        setval(nod,0);
        return;
    }
    int mid=(st+dr)/2;
    if(A[nod].lazy==1)
    {
        lazyupdate(nod,st,dr,A[nod].lazy);
        A[nod].lazy=0;
    }
    cazare(2*nod,st,mid);
    cazare(2*nod+1,mid+1,dr);
    A[nod].maxx = max(A[2*nod].maxx, A[2*nod+1].maxx);
    if( A[2*nod].maxx == mid - st + 1 )
    {
        A[nod].stanga = A[2*nod].maxx + A[2*nod+1].stanga;
    }
    else
        A[nod].stanga = A[2*nod].stanga;
    if( A[2*nod+1].maxx == dr - (mid+1) +1 )
    {
        A[nod].dreapta = A[2*nod+1].maxx + A[2*nod].dreapta;
    }
    else
        A[nod].dreapta = A[2*nod+1].dreapta;
    A[nod].maxx=max(A[nod].maxx, max ( A[nod].stanga,A[nod].dreapta ) );
    A[nod].maxx=max(A[nod].maxx, A[2*nod].dreapta+A[2*nod+1].stanga);
    // cout<<nod<<" "<<st<<" "<<dr<<" "<<A[nod].maxx<<" "<<A[nod].stanga<<" "<<A[nod].dreapta<<endl;
}

void iesire(int nod,int st,int dr)
{
    if(dr<a||st>b||st>dr)
        return;
    int mid=(st+dr)/2;
    if(a<=st&&dr<=b)
    {
        A[nod].val=1;
        A[nod].lazy=1;
        setval(nod,dr-mid+1);
        return;
    }

    if(A[nod].lazy==1)
    {
        lazyupdate(nod,st,dr,A[nod].lazy);
        A[nod].lazy=0;
    }
    iesire(2*nod,st,mid);
    iesire(2*nod+1,mid+1,dr);
    A[nod].maxx = max(A[2*nod].maxx, A[2*nod+1].maxx);
    if( A[2*nod].maxx == mid - st + 1 )
    {
        A[nod].stanga = A[2*nod].maxx + A[2*nod+1].stanga;
    }
    else
        A[nod].stanga = A[2*nod].stanga;
    if( A[2*nod+1].maxx == dr - (mid+1) +1 )
    {
        A[nod].dreapta = A[2*nod+1].maxx + A[2*nod].dreapta;
    }
    else
        A[nod].dreapta = A[2*nod+1].dreapta;
    A[nod].maxx=max(A[nod].maxx, max ( A[nod].stanga,A[nod].dreapta ) );
    A[nod].maxx=max(A[nod].maxx, A[2*nod].dreapta+A[2*nod+1].stanga);
    // cout<<nod<<" "<<st<<" "<<dr<<" "<<A[nod].maxx<<" "<<A[nod].stanga<<" "<<A[nod].dreapta<<endl;


}
int main()
{
    fin>>n>>q;
    build(1,1,n);
    for(; q--;)
    {
        fin>>tip;
        if(tip==3)
        {
            fout<<A[1].maxx<<"\n";
        }
        else
        {
            fin>>i>>m;
            a=i;
            b=i+m-1;
            //cout<<a<<" "<<b<<endl;
            if(tip==1)
            {
                cazare(1,1,n);
            }
            else
            {
                 iesire(1,1,n);
            }
        }
    }

}