Cod sursa(job #3266094)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 5 ianuarie 2025 18:05:26
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
using namespace std;

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

struct aint{
    int best,st,dr;
} v[400001];
int lazy[400001];

void push(int nod,int st,int dr){
    if(lazy[nod]==1){
        v[nod].best=v[nod].st=v[nod].dr=0;
        if(st!=dr){
            lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
        }
        lazy[nod]=-1;
    }
    if(lazy[nod]==0){
        v[nod].best=v[nod].st=v[nod].dr=(dr-st+1);
        if(st!=dr){
            lazy[2*nod]=lazy[2*nod+1]=lazy[nod];
        }
        lazy[nod]=-1;
    }
}

aint combin(aint a,aint b,int st,int dr){
    aint rasp;
    rasp.best=max(a.dr+b.st,max(a.best,b.best));
    int mij=(st+dr)/2;
    rasp.st=a.st;
    if(a.st==(mij-st+1)) rasp.st=a.st+b.st;
    rasp.dr=b.dr;
    if(b.dr==(dr-mij)) rasp.dr=a.dr+b.dr;
    return rasp;
}

aint get_value(int nod,int st,int dr){
    push(nod,st,dr);
    return v[nod];
}

void update(int nod,int st,int dr,int a,int b,int val){
    push(nod,st,dr);
    if(a>dr || st>b) return;
    if(a<=st && dr<=b){
        lazy[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    update(2*nod,st,mij,a,b,val);
    update(2*nod+1,mij+1,dr,a,b,val);
    v[nod]=combin(get_value(2*nod,st,mij),get_value(2*nod+1,mij+1,dr),st,dr);
}

void init(int nod,int st,int dr){
    if(st==dr){
        v[nod].best=v[nod].st=v[nod].dr=1;
        return ;
    }
    int mij=(st+dr)/2;
    init(2*nod,st,mij);
    init(2*nod+1,mij+1,dr);
    v[nod]=combin(v[2*nod],v[2*nod+1],st,dr);
}

int main()
{
    int n,q,i,cer,a,m;
    cin>>n>>q;
    for(i=1;i<=4*n;i++){
        lazy[i]=-1;
    }
    init(1,1,n);
    for(i=1;i<=q;i++){
        cin>>cer;
        if(cer==3){
            push(1,1,n);
            cout<<v[1].best<<"\n";
        }else if(cer==2){
            cin>>a>>m;
            update(1,1,n,a,a+m-1,0);
        }else{
            cin>>a>>m;
            update(1,1,n,a,a+m-1,1);
        }

    }
    return 0;
}