Cod sursa(job #3291952)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 6 aprilie 2025 13:11:55
Problema Hotel Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#define nmax (int)(1e5+1)
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
int n,q,task,x,y;
struct Aint{
    int lazy,st,dr,maxi;
}aint[4*nmax];
void build(int nod,int st,int dr){
    if(st==dr){
        aint[nod]={0,1,1,1};
        return ;
    }
    int mid=(st+dr)/2;
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    aint[nod]={0,dr-st+1,dr-st+1,dr-st+1};
}
void Lazy(int nod,int st,int dr){
    if(aint[nod].lazy==0)
        return ;
    if(st==dr){
        if(aint[nod].lazy==1)
            aint[nod]={0,0,0,0};
        else
            aint[nod]={0,1,1,1};
        return ;
    }
    if(aint[nod].lazy==1){
        aint[nod]={0,0,0,0};
        aint[2*nod].lazy=aint[2*nod+1].lazy=1;
    }else{
        aint[nod]={0,dr-st+1,dr-st+1,dr-st+1};
        aint[2*nod].lazy=aint[2*nod+1].lazy=2;
    }
}
void update(int nod,int st,int dr,int x,int y,int task){
    Lazy(nod,st,dr);
    if(x<=st&&dr<=y){
        aint[nod].lazy=task;
        return ;
    }
    int mid=(st+dr)/2;
    if(x<=mid)
        update(2*nod,st,mid,x,y,task);
    if(mid<y)
        update(2*nod+1,mid+1,dr,x,y,task);
    Lazy(2*nod,st,mid);
    Lazy(2*nod+1,mid+1,dr);
    aint[nod].maxi=max(max(aint[2*nod].maxi,aint[2*nod+1].maxi),aint[2*nod].dr+aint[2*nod+1].st);
    aint[nod].st=aint[2*nod].st;
    if(aint[2*nod].st==mid-st+1)
        aint[nod].st=aint[2*nod].st+aint[2*nod+1].st;
    aint[nod].dr=aint[2*nod+1].dr;
    if(aint[2*nod+1].dr==dr-mid)
        aint[nod].dr=aint[2*nod].dr+aint[2*nod+1].dr;
}
int main()
{
    cin>>n>>q;
    build(1,1,n);
    while(q--){
        cin>>task;
        if(task==3){
            cout<<aint[1].maxi<<'\n';
            continue;
        }
        cin>>x>>y;
        update(1,1,n,x,x+y-1,task);
    }
    return 0;
}
/// lazy = 0 secventa a fost deja procesata
/// lazy = 1 trebuie ocupate toate camerele din secventa
/// lazy = 2 trebuie eliberate toate camerele din secventa