Pagini recente » Cod sursa (job #2125602) | Cod sursa (job #2711368) | Cod sursa (job #2596895) | Cod sursa (job #2312905) | Cod sursa (job #1481183)
#include <set>
#include <iostream>
#include <fstream>
using namespace std;
struct seg{
int st, dr;
constexpr seg():
st(0), dr(0){}
constexpr seg(const int s, const int d):
st(s), dr(d){}
constexpr int marime(){
return dr-st+1; }
constexpr bool operator<(const seg& rhs){
return st > rhs.st; } };
class the_structure{
multiset<seg> segmente;
multiset<int> marimi;
public:
the_structure(const int n){
segmente.emplace(1, n);
marimi.insert(n); }
void adauga(const seg& s){
const auto scos = *segmente.lower_bound(s);
segmente.erase(scos);
marimi.erase(scos.marime());
if(scos.st <= s.st-1){
segmente.emplace(scos.st, s.st-1);
marimi.insert(s.st - scos.st); }
if(s.dr+1 <= scos.dr){
segmente.emplace(s.dr+1, scos.dr);
marimi.insert(scos.dr - s.dr); } }
void scoate(const seg& s){
auto it = segmente.insert(s);
if(it != begin(segmente)){
auto tmp = it;
--tmp;
if(it->dr == tmp->st-1){
const seg new_seg(it->st, tmp->dr);
marimi.erase(tmp->marime());
segmente.erase(it);
segmente.erase(tmp);
it = segmente.insert(new_seg);
marimi.insert(new_seg.marime()); } }
auto tmp = it;
++tmp;
if(tmp != end(segmente) && tmp->dr == it->st-1){
const seg new_seg(tmp->st, it->dr);
marimi.erase(tmp->marime());
segmente.erase(it);
segmente.erase(tmp);
it = segmente.insert(new_seg);
marimi.insert(new_seg.marime()); } }
int query(){
return marimi.empty() ? 0 : *(marimi.rbegin()); } };
int main(){
ifstream f("hotel.in");
ofstream g("hotel.out");
int n, p;
f >> n >> p;
the_structure ts(n);
for(int i = 0, t, x, m; i < p; ++i){
f >> t;
switch(t){
case 1:
f >> x >> m;
ts.adauga({x, x+m-1});
break;
case 2:
f >> x >> m;
ts.scoate({x, x+m-1});
break;
case 3:
g << ts.query() << '\n';
break; } }
return 0; }