Cod sursa(job #2431269)

Utilizator bluestorm57Vasile T bluestorm57 Data 18 iunie 2019 19:09:31
Problema Hotel Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <fstream>

using namespace std;

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

const int NMAX = 4e5 + 50;
int aib[NMAX],n,inleft[NMAX], inrigth[NMAX];

void build(int nod, int lo, int hi){
    if(lo > hi)
        return;
    if(lo == hi){
        aib[nod] = inleft[nod] = inrigth[nod] = 1;
        return;
    }
    int mid = (hi + lo) / 2;
    build(1,lo, mid);
    build(1,mid + 1 , hi);
    aib[nod] = inleft[nod] = inrigth[nod] = hi - lo + 1;
}

void update(int nod, int lo, int hi, int le, int ri){
    if(lo > hi || lo > ri || hi < le) return;
    if(lo >= le && hi <= ri){
        aib[nod] = inleft[nod] = inrigth[nod] = 0;
        return;
    }
    int mid = (lo + hi) / 2;
    if(aib[nod] == 0)
        aib[2 * nod] = aib[2 * nod + 1] = inleft[2 * nod] = inleft[2 * nod + 1] = inrigth[2 * nod] = inleft[2 * nod + 1] = 0;
    else
        if(aib[nod] == hi - lo + 1){
            aib[2 * nod + 1]  = inleft[2 * nod + 1] = inrigth[2 * nod + 1] = hi - mid;
            aib[2 *nod] = inleft[2 * nod] = inrigth[2 * nod] = mid - lo + 1;
        }
    update(2 * nod, lo, mid, le, ri);
    update(2 * nod + 1, mid + 1, hi, le , ri);
    aib[nod] = max(inleft[2 * nod + 1] + inrigth[2 * nod] , max(aib[2 * nod] , aib[2 * nod + 1] ));
    inleft[nod] = inleft[2 * nod];
    inrigth[nod] = inrigth[2 * nod + 1];
    if(inleft[nod] == mid - lo + 1)
        inleft[nod] += inleft[2 * nod + 1];
    if(inrigth[nod] == hi - mid)
        inrigth[nod] += inrigth[2 * nod];
}

void update2(int nod, int lo, int hi, int le, int ri){
    if(lo > hi || lo > ri || hi < le) return;
    if(lo >= le && hi <= ri){
        aib[nod] = inleft[nod] = inrigth[nod] = hi - lo + 1;
        return;
    }
    int mid = (lo + hi) / 2;
    if(aib[nod] == 0)
        aib[2 * nod] = aib[2 * nod + 1] = inleft[2 * nod] = inleft[2 * nod + 1] = inrigth[2 * nod] = inleft[2 * nod + 1] = 0;
    else
        if(aib[nod] == hi - lo + 1){
            aib[2 * nod + 1]  = inleft[2 * nod + 1] = inrigth[2 * nod + 1] = hi - mid;
            aib[2 *nod] = inleft[2 * nod] = inrigth[2 * nod] = mid - lo + 1;
        }
    update2(2 * nod, lo, mid, le, ri);
    update2(2 * nod + 1, mid + 1, hi, le , ri);
    aib[nod] = max(inleft[2 * nod + 1] + inrigth[2 * nod] , max(aib[2 * nod] , aib[2 * nod + 1] ));
    inleft[nod] = inleft[2 * nod];
    inrigth[nod] = inrigth[2 * nod + 1];
    if(inleft[nod] == mid - lo + 1)
        inleft[nod] += inleft[2 * nod + 1];
    if(inrigth[nod] == hi - mid)
        inrigth[nod] += inrigth[2 * nod];
}

int main(){
    int i,a,b,q,m;
    f >> n >> m;
    build(1,1,n);

    for(i = 1 ; i <= m ; i++){
        f >> q;
        if(q == 1){
            f >> a >> b;
            update(1,1,n,a, a + b - 1);
        }else
            if(q == 2){
                f >> a >> b;
                update2(1,1,n,a,a + b - 1);
            }else
                g << aib[1] << "\n";
    }

    return 0;
}