Cod sursa(job #3222035)

Utilizator Alex_Mihai10Mihai Alex-Ioan Alex_Mihai10 Data 8 aprilie 2024 21:40:25
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>
#define MAX 100005

using namespace std;

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

struct str
{
    int best;
    int inc;
    int fin;
    bool flag;
}aint[4*MAX];

void build(int nod,int st,int dr)
{
    if(st==dr)
        aint[nod]={1,1,1,0};
    else
    {
        int mij=(st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
        aint[nod]={dr-st+1,dr-st+1,dr-st+1,0};
    }
}

void update(int nod,int st,int dr,int a,int b,int cer)
{
    if(a<=st && dr<=b)
    {
        if(cer==1)
            aint[nod]={0,0,0,1};
        else
            aint[nod]={dr-st+1,dr-st+1,dr-st+1,1};
    }
    else
    {
        int mij=(st+dr)/2;
        if(aint[nod].flag)
        {
            if(aint[nod].best)
            {
                aint[2*nod]={mij-st+1,mij-st+1,mij-st+1,1};
                aint[2*nod+1]={dr-mij,dr-mij,dr-mij,1};
            }
            else
            {
                aint[2*nod]={0,0,0,1};
                aint[2*nod+1]={0,0,0,1};
            }
            aint[nod].flag=0;
        }
        if(a<=mij)
            update(2*nod,st,mij,a,b,cer);
        if(b>mij)
            update(2*nod+1,mij+1,dr,a,b,cer);
        aint[nod].best=max(max(aint[2*nod].best,aint[2*nod+1].best),aint[2*nod].fin+aint[2*nod+1].inc);
        if(aint[2*nod].inc==mij-st+1)
            aint[nod].inc=aint[2*nod].inc+aint[2*nod+1].inc;
        else
            aint[nod].inc=aint[2*nod].inc;
        if(aint[2*nod+1].fin==dr-mij)
            aint[nod].fin=aint[2*nod].fin+aint[2*nod+1].fin;
        else
            aint[nod].fin=aint[2*nod+1].fin;
    }
}

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