Cod sursa(job #289317)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 26 martie 2009 17:49:40
Problema Hotel Scor 100
Compilator cpp Status done
Runda aa Marime 2.24 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);   
        }   
    }   
}