Cod sursa(job #287166)

Utilizator tvladTataranu Vlad tvlad Data 24 martie 2009 16:34:29
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <set>
using namespace std;

typedef pair<int,int> p_ii;
typedef pair<int, pair<int,int>> p_ip;
#define mp make_pair

class cmp_p_ii { public: bool operator() ( const p_ii &a, const p_ii &b ) { return (a.second == b.second) ? a.first > b.first : a.second < b.second; } };

int main() {
	freopen("hotel.in","rt",stdin);
	freopen("hotel.out","wt",stdout);

	int n,m;
	set<p_ii, cmp_p_ii> C;
	set<p_ip, greater<p_ip> > Q;
	
	scanf("%d %d",&n,&m);
	C.insert(mp(1,n));
	Q.insert(mp(n,mp(1,n)));
	for (int a,b,c; m; --m) {
		scanf("%d",&c);
		if (c == 1) {
			scanf("%d %d",&a,&b);
			b += a-1;
			set<p_ii, cmp_p_ii>::iterator w = C.lower_bound(mp(a,b));
			Q.erase(Q.find(mp(w->second - w->first + 1, *w)));
			if (w->first < a) {
				C.insert(mp(w->first,a-1));
				Q.insert(mp(a - w->first, mp(w->first,a-1)));
			}
			if (b < w->second) {
				C.insert(mp(b+1,w->second));
				Q.insert(mp(w->second - b, mp(b+1,w->second)));
			}
			C.erase(w);
		} else
		if (c == 2) {
			scanf("%d %d",&a,&b);
			b += a-1;
			set<p_ii, cmp_p_ii>::iterator right = C.lower_bound(mp(b,b));
			set<p_ii, cmp_p_ii>::iterator left = C.lower_bound(mp(a-1,a-1));
			p_ii new_pair(a,b);
			if (right != C.end() && right->first == b+1) {
				new_pair.second = right->second;
				Q.erase(Q.find(mp(right->second - right->first + 1, *right)));
				C.erase(right);
			}
			if (left != C.end() && left->second == a-1) {
				new_pair.first = left->first;
				Q.erase(Q.find(mp(left->second - left->first + 1, *left)));
				C.erase(left);
			}
			C.insert(new_pair);
			Q.insert(mp(new_pair.second - new_pair.first + 1,new_pair));
		} else {
			printf("%d\n",Q.begin()->first);
		}
	}
}