Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 250010
- #define INF 1e9 + 7
- #define mp(a, b) make_pair(a, b)
- #define pb push_back
- #define sc scanf
- #define pr printf
- #define secon second.first
- #define thir second.second
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef pair<int, pii> piii;
- typedef struct item * pitem;
- struct item {
- int prior, cnt, mine;
- int x, y, z;
- pitem l, r;
- };
- pitem create(int x, int y, int z){
- pitem a = new item();
- a->prior = ((rand() << 16) ^ rand())&0x7fffffff;
- a->x = x;
- a->y = y;
- a->z = z;
- return a;
- }
- int cnt(pitem it){
- return it? it->cnt: 0;
- }
- void upd_cnt(pitem it){
- if(it) it->cnt = cnt(it->l) + cnt(it->r) + 1;
- }
- void merge(pitem & t, pitem l, pitem r){
- if(!l || !r) t = l ? l: r;
- else if(l->prior > r->prior) merge(l->r, l->r, r), t = l;
- else merge(r->l, l, r->l), t = r;
- upd_cnt(t);
- }
- bool cmp(piii x, pitem y){
- if(x.first == y->x) {
- if(x.secon == y->y) return x.thir < y->z;
- return x.secon < y->y;
- }
- return x.first < y->x;
- }
- void split(pitem t, pitem &l, pitem & r, piii key, int add = 0){
- if(!t) return void(l = r = 0);
- if(cmp(key, t)) split(t->l, l, t->l, key, add), r = t;
- else split(t->r, t->r, r, key, add + 1 + cnt(t->l)), l = t;
- upd_cnt(t);
- }
- void output(pitem t){
- if(!t) return;
- output(t->l);
- cout << t->x << " " << t->y << " " << t->z << endl;
- output(t->r);
- }
- map<pii, int> cntL, cntD;
- int main(){
- int n; scanf("%d", &n);
- pitem lunch = new item();
- pitem dinner = new item();
- for(int i = 0; i < n; i++){
- int a, b; scanf("%d %d", &a, &b);
- if(i == 0) {
- lunch = create(a, b, ++cntL[mp(a, b)]);
- dinner = create(b, a, ++cntD[mp(b, a)]);
- }else{
- pitem r; split(lunch, lunch, r, mp(a, mp(b, INF)));
- merge(lunch, lunch, create(a, b, ++cntL[mp(a, b)]));
- merge(lunch, lunch, r);
- cout << "Lunch\n";
- output(lunch);
- split(dinner, dinner, r, mp(b, mp(a, INF)));
- merge(dinner, dinner, create(b, a, ++cntD[mp(b, a)]));
- merge(dinner, dinner, r);
- cout << "Dinner\n";
- output(dinner);
- }
- }
- for(int i = 1; i <= n; i++){
- pitem r; split(lunch, lunch, r, mp(a, mp(b, INF)));
- pitem equals; split(lunch, lunch, equals, mp(a, mp(b-1, INF)));
- pitem one; split(equals, equals, one, mp(a, mp(b, equals->cnt-1)));
- merge(lunch, lunch, equals);
- merge(lunch, lunch, r);
- split(dinner, dinner, r, mp(b, mp(a, INF)));
- split(dinner, dinner, equals, mp(b, mp(a-1, INF)));
- split(equals, equals, one, mp(b, mp(a, equals->cnt-1)));
- merge(dinner, dinner, equals);
- merge(dinner, dinner, r);
- cout << "Lunch\n";
- output(lunch);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement