Cod sursa(job #3279164)

Utilizator NonnonsniperCretu Marian-Dumitru Nonnonsniper Data 21 februarie 2025 23:06:13
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda lasm_21_02_2025_clasa11 Marime 2.01 kb
#include<bits/stdc++.h>
using namespace std;

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

struct Nod
{
    int max_lib,st_lib,dr_lib,tot_lib;
};

Nod arb[400005];
int n;

void combina(int nod,int st,int dr)
{
    int mij=(st+dr)/2,st_fiu=2*nod,dr_fiu=2*nod+1;
    arb[nod].st_lib=arb[st_fiu].st_lib;
    arb[nod].dr_lib=arb[dr_fiu].dr_lib;
    if(arb[st_fiu].tot_lib==mij-st+1)
        arb[nod].st_lib+=arb[dr_fiu].st_lib;
    if(arb[dr_fiu].tot_lib==dr-mij)
        arb[nod].dr_lib+=arb[st_fiu].dr_lib;
    arb[nod].tot_lib=arb[st_fiu].tot_lib+arb[dr_fiu].tot_lib;
    arb[nod].max_lib=max({arb[st_fiu].max_lib,arb[dr_fiu].max_lib,arb[st_fiu].dr_lib+arb[dr_fiu].st_lib});
}

void construieste(int nod,int st,int dr)
{
    if(st==dr)
        arb[nod]={1,1,1,1};
    else
    {
        int mij=(st+dr)/2;
        construieste(2*nod,st,mij);
        construieste(2*nod+1,mij+1,dr);
        combina(nod,st,dr);
    }
}

void actualizeaza(int nod,int st,int dr,int l,int r,int val)
{
    if(st>dr||st>r||dr<l) return;
    if(st==dr)
        arb[nod]={val,val,val,val};
    else
    {
        int mij=(st+dr)/2;
        actualizeaza(2*nod,st,mij,l,r,val);
        actualizeaza(2*nod+1,mij+1,dr,l,r,val);
        combina(nod,st,dr);
    }
}

void ocupa(int l,int r)
{
    actualizeaza(1,0,n-1,l,r,0);
}

void elibereaza(int l,int r)
{
    actualizeaza(1,0,n-1,l,r,1);
}

int maxSegmentLiber()
{
    return arb[1].max_lib;
}

int main()
{
    int p;
    in>>n>>p;
    construieste(1,0,n-1);
    int rez[100005],nrRez=0;
    for(int i=0;i<p;i++)
    {
        int com;
        in>>com;
        if(com==1)
        {
            int i,m;
            in>>i>>m;
            ocupa(i-1,i+m-2);
        }
        else if(com==2)
        {
            int i,m;
            in>>i>>m;
            elibereaza(i-1,i+m-2);
        }
        else if(com==3)
            rez[nrRez++]=maxSegmentLiber();
    }
    for(int i=0;i<nrRez;i++)
        out<<rez[i]<<"\n";
    return 0;
}