Cod sursa(job #2772738)

Utilizator GligarEsterabadeyan Hadi Gligar Data 2 septembrie 2021 17:35:11
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>

using namespace std;

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

const int nmax=100000, n2max=(1<<17);

struct str{
    int x,l,r;
};

str v[2*n2max];

void zero(int nod, int x){
    v[nod].l=x;
    v[nod].r=x;
    v[nod].x=x;
}

void delay(int nod, int l, int r){
    if(v[nod].l==0){
        zero(nod*2,0);
        zero(nod*2+1,0);
    }else{
        zero(nod*2,(r-l+1)/2);
        zero(nod*2+1,(r-l+1)/2);
    }
}

void update(int a, int b, int nod, int l, int r, int x){
    if(r<a||b<l){
        return;
    }else if(a<=l&&r<=b){
        if(x==0){
            zero(nod,0);
        }else{
            zero(nod,r-l+1);
        }
        return;
    }else{
        if(v[nod].l==0||v[nod].l==r-l+1){
            delay(nod,l,r);
        }
        update(a, b, nod*2, l, (l+r)/2, x);
        update(a, b, nod*2+1, (l+r)/2+1, r, x);
        if(v[nod*2].l==(r-l+1)/2){
            v[nod].l=v[nod*2].l+v[nod*2+1].l;
        }else{
            v[nod].l=v[nod*2].l;
        }
        if(v[nod*2+1].l==(r-l+1)/2){
            v[nod].r=v[nod*2+1].r+v[nod*2].r;
        }else{
            v[nod].r=v[nod*2+1].r;
        }
        v[nod].x=max(max(v[nod*2].x,v[nod*2+1].x),v[nod*2].r+v[nod*2+1].l);
        return;
    }
}

int max(int a, int b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}

int main(){
    int n,m;
    fin>>n>>m;
    int n2=1;
    while(n2<n){
        n2*=2;
    }
    for(int i=1;i<=n;i++){
        int j=n2+i-1;
        v[j].l=1;
        v[j].r=1;
        v[j].x=1;
    }
    int s=1;
    for(int i=n2-1;i>=1;i--){
        int l=i*2,r=i*2+1;
        if(v[l].l==s){
            v[i].l=v[l].l+v[r].l;
        }else{
            v[i].l=v[l].l;
        }
        if(v[r].l==s){
            v[i].r=v[r].r+v[l].r;
        }else{
            v[i].r=v[r].r;
        }
        v[i].x=max(max(v[l].x,v[r].x),v[l].r+v[r].l);
        if((i&(i-1))==0){
            s*=2;
        }
    }
    for(int i=1;i<=m;i++){
        int k;
        fin>>k;
        if(k==1){
            int a,b;
            fin>>a>>b;
            b=a+b-1;
            update(a,b,1,1,n2,0);
        }else if(k==2){
            int a,b;
            fin>>a>>b;
            b=a+b-1;
            update(a,b,1,1,n2,1);
        }else{
            fout<<v[1].x<<"\n";
        }
    }
    return 0;
}