Cod sursa(job #2797513)

Utilizator ValiAntonieAntonie Valentin ValiAntonie Data 10 noiembrie 2021 01:52:16
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb

#include <bits/stdc++.h>

using namespace std;

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

int i,n,v[100005],a[500000],m,st2,dr2,apref[500000],asuf[500000],Max,p,mark[500000];


void build(int nod, int st, int dr){
    if(st == dr){
        a[nod] = -1;
        return;
    }
    int mij = (st + dr) >> 1;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    Max = 0;
    Max = dr - st + 1;
}


void update(int nod, int st, int dr, int st1, int dr1){
    int mij = (st + dr) >> 1;
    if(st == dr && st >= st2 && dr <= dr2 && !mark[nod]){
       apref[nod] = 0;
       asuf[nod] = 0;
       a[nod] = 0;
       mark[nod] = 1;
       return;
    }
    else if(st == dr && !mark[nod]){
        apref[nod] = 1;
        asuf[nod] = 1;
        a[nod] = 1;
        return;
    }
    else if(st == dr)
        return;
    else{
        update(2*nod,st,mij,st1,dr1);
        update(2*nod+1,mij+1,dr,st1,dr1);
        if(apref[2*nod+1]==dr-mij && asuf[2*nod+1]==dr-mij)
            apref[nod] = apref[2*nod+1] + apref[2*nod];
        else
            apref[nod] = apref[2*nod+1];
        if(asuf[2*nod] == mij-st+1 && apref[2*nod]==mij-st+1)
            asuf[nod] = asuf[2*nod+1] + asuf[2*nod];
        else
            asuf[nod] = asuf[2*nod];
        a[nod] = max(max(a[2*nod],a[2*nod+1]),apref[2*nod]+asuf[2*nod+1]);
        Max = 0;
        Max = max(Max,a[nod]);
        }
}

void update2(int nod, int st, int dr, int st1, int dr1){
    int mij = (st + dr) >> 1;
    if(st == dr && st >= st1 && dr <= dr1 && !a[nod]){
        apref[nod] = 1;
        asuf[nod] = 1;
        a[nod] = 1;
        mark[nod] = 0;
        return;
    }
    else if(st == dr)
        return;
    else{
        update2(2*nod,st,mij,st1,dr1);
        update2(2*nod+1,mij+1,dr,st1,dr1);
        if(apref[2*nod+1]==dr-mij && asuf[2*nod+1]==dr-mij)
            apref[nod] = apref[2*nod+1] + apref[2*nod];
        else
            apref[nod] = apref[2*nod+1];
        if(asuf[2*nod] == mij-st+1 && apref[2*nod]==mij-st+1)
            asuf[nod] = asuf[2*nod+1] + asuf[2*nod];
        else
            asuf[nod] = asuf[2*nod];
        a[nod] = max(max(a[2*nod],a[2*nod+1]),apref[2*nod]+asuf[2*nod+1]);
        Max = 0;
        Max = max(Max,a[nod]);
    }
}



int main()
{
fin>>n>>m;
build(1,1,n);
for(i=1;i<=m;i++){
    fin>>p;
    if(p == 1){
    fin>>st2>>dr2;
    dr2 = st2 + dr2 - 1;
    Max = 0;
    update(1,1,n,1,st2-1);
    update(1,1,n,dr2+1,n);
    }
    else if(p == 2){
    fin>>st2>>dr2;
    dr2 = st2 + dr2 - 1;
    Max = 0;
    update2(1,1,n,st2,dr2);
    }
    else
        fout << Max << '\n';

}

    return 0;
}