Cod sursa(job #991965)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 31 august 2013 21:44:57
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100003;

struct segment_tree {

    int left, right, best;
    short updated;

};

segment_tree AIB[NMAX * 3];
int _left, _right;

void AIB_build (const int &node, const int &left, const int &right) {

    AIB[node].left = AIB[node].right = AIB[node].best = right - left + 1;
    AIB[node].updated = 2;
    if (left == right)
        return;
    const int &middle = left + right >> 1;
    AIB_build (node * 2, left, middle);
    AIB_build (node * 2 + 1, middle + 1, right);

}

void AIB_update (const int &node, const int &left, const int &right, const short &update) {

    if (left >= _left && right <= _right) {
        AIB[node].left = AIB[node].right = AIB[node].best = update ? right - left + 1 : 0;
        AIB[node].updated = update;
        return;
    }
    if (_right < left || _left > right)
        return;
    const int &middle = left + right >> 1;
    if (AIB[node].updated != 2) {
        int last_left = _left, last_right = _right;
        _left = left;
        _right = middle;
        AIB_update (node * 2, left, middle, AIB[node].updated);
        _left = middle + 1;
        _right = right;
        AIB_update (node * 2 + 1, middle + 1, right, AIB[node].updated);
        _left = last_left;
        _right = last_right;
        AIB[node].updated = 2;
    }
    AIB_update (node * 2, left, middle, update);
    AIB_update (node * 2 + 1, middle + 1, right, update);
    AIB[node].best = max (max (AIB[node * 2].best, AIB[node * 2 + 1].best), AIB[node * 2].right + AIB[node * 2 + 1].left);
    if (AIB[node * 2].left == middle - left + 1)
        AIB[node].best = AIB[node].left = middle - left + 1 + AIB[node * 2 + 1].left;
    else
        AIB[node].left = AIB[node * 2].left;
    if (AIB[node * 2 + 1].right == right - middle)
        AIB[node].best = AIB[node].right = right - middle + AIB[node * 2].right;
    else
        AIB[node].right = AIB[node * 2 + 1].right;

}

int main () {

    freopen ("hotel.in", "r", stdin);
    freopen ("hotel.out", "w", stdout);
    int N, P;
    short t;
    scanf ("%d%d", &N, &P);
    AIB_build (1, 1, N);
    while (P--) {
        scanf ("%hd", &t);
        if (t < 3) {
            scanf ("%d%d", &_left, &_right);
            _right += _left - 1;
            AIB_update (1, 1, N, t - 1);
            continue;
        }
        printf ("%d\n", AIB[1].best);
    }

}