Cod sursa(job #2059632)

Utilizator retrogradLucian Bicsi retrograd Data 7 noiembrie 2017 11:56:38
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

struct IntervalContainer {
    map<int, int> s;
    multiset<int, greater<int>> lens;
    using Iter = map<int, int>::iterator;
     
    Iter AddInterval(int l, int r) {
        if (l == r) return s.end();
        Iter it = s.lower_bound(l);
        while (it != s.end() && it->first <= r) {
            r = max(r, it->second);
            it = erase(it);
        }
        while (it != s.begin() && (--it)->second >= l) {
            l = min(l, it->first);
            r = max(r, it->second);
            it = erase(it);
        }
        return insert({l, r});
    }

    void RemoveInterval(int l, int r) {
        if (l == r) return;
        auto it = AddInterval(l, r);
        int l2 = it->first, r2 = it->second;
        erase(it);
        if (l != l2) insert({l2, l});
        if (r != r2) insert({r, r2});
    }

    Iter erase(Iter it) {
        lens.erase(lens.find(it->second - it->first));
        return s.erase(it);
    }
    Iter insert(pair<int, int> x) {
        lens.insert(x.second - x.first);
        return s.insert(x).first;
    } 
    int Get() { return *lens.begin(); }
};

int main() {
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");

    int n, m; cin >> n >> m;
    IntervalContainer ic;
    ic.AddInterval(0, n);
    while (m--) {
        int t; cin >> t;
        if (t == 1) {
            int a, b; cin >> a >> b;
            ic.RemoveInterval(a - 1, a + b - 1);
        }
        if (t == 2) {
            int a, b; cin >> a >> b;
            ic.AddInterval(a - 1, a + b - 1);
        }
        if (t == 3) { cout << ic.Get() << '\n'; }
    }
    return 0;
}