Cod sursa(job #2472709)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 12 octombrie 2019 18:40:18
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

FILE *in = fopen("hotel.in", "r"), *out = fopen("hotel.out", "w")  ;

struct node {
        int l, r, val ;
};

int n, q ;

node aint[1 << 20] ;

void build(int p, int L, int R) {
        aint[p] = {R - L + 1, R - L + 1, R - L + 1} ;
        if (L == R) return ;
        int M = ((L + R) >> 1) ;
        build(p << 1, L, M) ;
        build((p << 1) + 1, M + 1, R) ;
}

void update(int p, int L, int R, int l, int r, bool f) {
        if (L > R) return ;
        if (L > r || R < l) return ;
        if (l <= L && R <= r) {
                if (f) aint[p] = {R - L + 1, R - L + 1, R - L + 1} ;
                else aint[p] = {0, 0, 0} ;
                return ;
        }
        int M((L + R) >> 1) ;
        if (aint[p].val == 0) {
                aint[(p << 1)] = {0, 0, 0} ;
                aint[(p << 1) + 1] = {0, 0, 0} ;
        }
        if (aint[p].val == R - L + 1) {
                aint[(p << 1)] = {M - L + 1, M - L + 1, M - L + 1} ;
                aint[(p << 1) + 1] = {R - M, R - M, R - M} ;
        }

        if (l <= M) {
                update((p << 1), L, M, l, r, f) ;
        }
        if (r > M) {
                update((p << 1) + 1, M + 1, R, l, r, f) ;
        }

        aint[p].l = aint[(p << 1)].l ;
        if (aint[(p << 1)].l == M - L + 1) {
                aint[p].l += aint[(p << 1) + 1].l ;
        }

        aint[p].r = aint[(p << 1) + 1].r ;
        if (aint[(p << 1) + 1].r == R - M) {
                aint[p].r += aint[(p << 1)].r ;
        }

        aint[p].val = std::max(std::max(aint[(p << 1)].val, aint[(p << 1) + 1].val), aint[(p << 1)].r + aint[(p << 1) + 1].l) ;
}

int main() {
        fscanf(in, "%d %d", &n, &q) ;
        build(1, 1, n) ;
        int k, x, y ;
        while (q --) {
                fscanf(in, "%d", &k)  ;
                if (k == 1) fscanf(in, "%d %d", &x, &y), update(1, 1, n, x, x + y - 1, 0) ;
                if (k == 2) fscanf(in, "%d %d", &x, &y), update(1, 1, n, x, x + y - 1, 1) ;
                if (k == 3) fprintf(out, "%d\n", aint[1].val) ;
        }
}