Cod sursa(job #1197955)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 14 iunie 2014 10:45:13
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <iostream>
#include <iomanip>
#include <fstream>

#include <algorithm>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif

#include <cstdio>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdlib>

#define st first
#define nd second

using namespace std;

typedef long long int64;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int NMAX = 100010, inf = 0x3f3f3f3f;

int N, Q, i, m, c;
int tree[4 * NMAX], lazy[4 * NMAX];

class SegmentTree {

public:
    SegmentTree() {};

    void update(const int node, const int left, const int right, const int qleft, const int qright, const int value) {
        if (lazy[node]) {
            tree[node] = (lazy[node] - 1) * (right - left + 1);
            if (left != right) {
                lazy[node * 2] = lazy[node];
                lazy[node * 2 + 1] = lazy[node];
            }
            lazy[node] = 0;
        }

        if (left > right || left > qright || right < qleft) return;

        if (left >= qleft && right <= qright) {
            tree[node] = (value - 1) * (right - left + 1);
            if (left != right) {
                lazy[node * 2] = value;
                lazy[node * 2 + 1] = value;
            }
            return;
        }

        int div = (left + right) >> 1;
        update(node * 2, left, div, qleft, qright, value);
        update(node * 2 + 1, div + 1, right, qleft, qright, value);

        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }

    pair<int, int> query(const int node, const int left, const int right) {
        if (lazy[node]) {
            tree[node] = (lazy[node] - 1) * (right - left + 1);
            if (left != right) {
                lazy[node * 2] = lazy[node];
                lazy[node * 2 + 1] = lazy[node];
            }
            lazy[node] = 0;
        }

        if (tree[node] == 0) return make_pair(left, right);
        if (tree[node] == right - left + 1) return make_pair(inf + 1, inf);

        pair<int, int> x, y;
        int div = (left + right) >> 1;
        x = query(node * 2, left, div);
        y = query(node * 2 + 1, div + 1, right);

        if (x.nd + 1 == y.st) return make_pair(x.st, y.nd);
        if (x.nd - x.st > y.nd - y.st) return x;
        return y;
    }
} Tree;

int main() {
    Tree = SegmentTree();
    fin >> N >> Q;
    while(Q--) {
        fin >> c;
        if (c == 1) {
            fin >> i >> m;
            Tree.update(1, 1, N, i, i + m - 1, 2);
        }
        else if (c == 2) {
            fin >> i >> m;
            Tree.update(1, 1, N, i, i + m - 1, 1);
        }
        else {
            pair<int, int> res;
            res = Tree.query(1, 1, N);
            if (res.st == inf + 1) fout << "0\n";
            else fout << res.nd - res.st + 1 << '\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}