Cod sursa(job #1481183)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 septembrie 2015 23:17:00
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#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; }