Pagini recente » Istoria paginii runda/meow2/clasament | Istoria paginii utilizator/laura1999 | Clasament dupa rating | Istoria paginii runda/ioi_practice_mirror_2022/clasament | Cod sursa (job #2059632)
#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;
}