Cod sursa(job #1316411)

Utilizator SmarandaMaria Pandele Smaranda Data 13 ianuarie 2015 20:01:20
Problema Hotel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.63 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 100003;

struct NOD {
    int zero, a, b;
};

int n, p, x, y;
NOD aint [4 * N + 10];
int unsolved [4 * N + 10];

void solve (int node, int st, int dr) {
    unsolved [(node << 1)] = unsolved [(node << 1) + 1] = unsolved [node];
    if (unsolved [node] == -1)
        aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
    else
        aint [node].zero = aint [node].a = aint [node].b = 0;
    unsolved [node] = 0;
}

void build (int node, int st, int dr) {
    int m;

    if (st == dr) {
        aint [node].zero = aint [node].a = aint [node].b = 1;
        return;
    }

    aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
    m = (st + dr) / 2;
    build (node << 1, st, m);
    build ((node << 1) + 1, m + 1, dr);
}

void add (int node, int st, int dr) {
    int m;

    if (unsolved [node])
        solve (node, st, dr);

    if (x <= st && dr <= y) {
        aint [node].zero = aint [node].a = aint [node].b = 0;
        unsolved [(node << 1)] = unsolved [(node << 1) + 1] = 1;
        return ;
    }

    m = (st + dr) / 2;
    if (x <= m)
        add (node << 1, st, m);
    if (y > m)
        add ((node << 1) + 1, m + 1, dr);
    if (unsolved [node << 1])
        solve (node << 1, st, m);
    if (unsolved [(node << 1) + 1])
        solve ((node << 1) + 1, m + 1, dr);
    aint [node].zero = max (aint [(node << 1)].zero, aint [(node << 1) + 1].zero);
    aint [node].zero = max (aint [node].zero, aint [node << 1].b + aint [(node << 1) + 1].a);
    aint [node].a = aint [(node << 1)].a;
    aint [node].b = aint [(node << 1) + 1].b;
    if (aint [node].zero == dr - st + 1)
        aint [node].a = aint [node].b = dr - st + 1;
    if (aint [node].a == m - st + 1)
        aint [node].a = aint [node].a + aint [(node << 1) + 1].a;
    if (aint [node].b == dr - m)
        aint [node].b = aint [node].b + aint [(node << 1)].b;
}

void release (int node, int st, int dr) {
    int m;

    if (unsolved [node])
        solve (node, st, dr);
    m = (st + dr) / 2;
    if (x <= st && dr <= y) {
        aint [node].zero = aint [node].a = aint [node].b = dr - st + 1;
        unsolved [node << 1] = -1;
        unsolved [(node << 1) + 1] = -1;
        return;
    }
    if (x <= m)
        release (node << 1, st, m);
    if (y > m)
        release ((node << 1) + 1, m + 1, dr);
    if (unsolved [node << 1])
        solve (node << 1, st, m);
    if (unsolved [(node << 1) + 1])
        solve ((node << 1) + 1, m + 1, dr);
    aint [node].zero = max (aint [(node << 1)].zero, aint [(node << 1) + 1].zero);
    aint [node].zero = max (aint [node].zero, aint [(node << 1)].b + aint [(node << 1) + 1].a);
    aint [node].a = aint [(node << 1)].a;
    aint [node].b = aint [(node << 1) + 1].b;
    if (aint [node].zero == dr - st + 1)
        aint [node].a = aint [node].b = dr - st + 1;
    if (aint [node].a == m - st + 1)
        aint [node].a = aint [node].a + aint [(node << 1) + 1].a;
    if (aint [node].b == dr - m)
        aint [node].b = aint [node].b + aint [(node << 1)].b;
}

int main () {
    int i, type;

    freopen ("hotel.in", "r", stdin);
    freopen ("hotel.out", "w", stdout);

    scanf ("%d%d", &n, &p);
    build (1, 1, n);
    for (i = 1; i <= p; i ++) {
        scanf ("%d", &type);
        if (type == 3) {
            printf ("%d\n", aint [1].zero);
            continue;
        }
        scanf ("%d%d", &x, &y);
        y = x + y - 1;
        if (type == 1)
            add (1, 1, n);
        else
            release (1, 1, n);
    }
    return 0;
}