Cod sursa(job #1872191)

Utilizator mariusn01Marius Nicoli mariusn01 Data 7 februarie 2017 23:40:05
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>

using namespace std;

struct elem {
    int maxim;
    int stanga;
    int dreapta;
};

elem A[400010];

int n, p, t, a, b;


void update(int nod, int st, int dr, int a, int b, int upd) {
    if (a <= st && b >= dr) {
        if (upd == 1) {
            A[nod].maxim = A[nod].stanga = A[nod].dreapta = 0;
        } else {
            A[nod].maxim = A[nod].stanga = A[nod].dreapta = dr-st+1;
        }
    } else {

        int mid = (st + dr) / 2;

//lazy update
        if (A[nod].maxim == 0) {
            A[2*nod].maxim = A[2*nod].stanga = A[2*nod].dreapta = 0;
            A[2*nod+1].maxim = A[2*nod+1].stanga = A[2*nod+1].dreapta = 0;
        }
        if (A[nod].maxim == dr-st+1) {
            A[2*nod].maxim = A[2*nod].stanga = A[2*nod].dreapta = mid-st+1;
            A[2*nod+1].maxim = A[2*nod+1].stanga = A[2*nod+1].dreapta = dr-mid;
        }



        if (a <= mid)
            update(2*nod, st, mid, a, b, upd);
        if (b > mid)
            update(2*nod+1, mid+1, dr, a, b, upd);

        A[nod].maxim = max(A[2*nod].maxim, max(A[2*nod+1].maxim, A[2*nod].dreapta + A[2*nod+1].stanga));

        A[nod].stanga = A[2*nod].stanga;
        if (A[nod].stanga == mid-st+1)
            A[nod].stanga += A[2*nod+1].stanga;

        A[nod].dreapta = A[2*nod+1].dreapta;
        if (A[nod].dreapta == dr-mid)
            A[nod].dreapta += A[2*nod].dreapta;

        //A[nod].maxim = max(A[nod].maxim, max(A[nod].stanga, A[nod].dreapta));
    }
}

void build(int nod, int st, int dr) {
    if (st == dr) {
        A[nod].maxim = A[nod].stanga = A[nod].dreapta = 1;
    } else {
        A[nod].maxim = A[nod].stanga = A[nod].dreapta = dr-st+1;
        int mid = (st + dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
    }
}

int main () {

    ifstream fin("hotel.in");
    ofstream fout("hotel.out");
    fin>>n>>p;
    build(1, 1, n);
    while (p--) {
        fin>>t;
        if (t == 1) {
            fin >> a >> b;
            b = a + b - 1;
            update(1, 1, n, a, b, 1);
        }
        if (t == 2) {
            fin >> a >> b;
            b = a + b - 1;
            update(1, 1, n, a, b, -1);
        }
        if (t == 3) {
            fout<<A[1].maxim<<"\n";
        }
    }
    return 0;
}