Advertisement
Manioc

E russian contest

Mar 15th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 250010
  3. #define INF 1e9 + 7
  4. #define mp(a, b) make_pair(a, b)
  5. #define pb push_back
  6. #define sc scanf
  7. #define pr printf
  8. #define secon second.first
  9. #define thir second.second
  10.  
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair<int, int> pii;
  14. typedef pair<int, pii> piii;
  15.  
  16. typedef struct item * pitem;
  17. struct item {
  18.     int prior, cnt, mine;
  19.     int x, y, z;
  20.     pitem l, r;
  21. };
  22.  
  23. pitem create(int x, int y, int z){
  24.     pitem a = new item();
  25.     a->prior = ((rand() << 16) ^ rand())&0x7fffffff;
  26.     a->x = x;
  27.     a->y = y;
  28.     a->z = z;
  29.     return a;
  30. }
  31.  
  32. int cnt(pitem it){
  33.     return it? it->cnt: 0;
  34. }
  35. void upd_cnt(pitem it){
  36.     if(it) it->cnt = cnt(it->l) + cnt(it->r) + 1;
  37. }
  38. void merge(pitem & t, pitem l, pitem r){
  39.     if(!l || !r) t = l ? l: r;
  40.     else if(l->prior > r->prior) merge(l->r, l->r, r), t = l;
  41.     else merge(r->l, l, r->l), t = r;
  42.     upd_cnt(t);
  43. }
  44.  
  45. bool cmp(piii x, pitem y){
  46.     if(x.first == y->x) {
  47.         if(x.secon == y->y) return x.thir < y->z;
  48.         return x.secon < y->y;
  49.     }
  50.     return x.first < y->x;
  51. }
  52. void split(pitem t,  pitem &l, pitem & r, piii key, int add = 0){
  53.     if(!t) return void(l = r = 0);
  54.     if(cmp(key, t)) split(t->l, l, t->l, key, add), r = t;
  55.     else split(t->r, t->r, r, key, add + 1 + cnt(t->l)), l = t;
  56.  
  57.     upd_cnt(t);
  58. }
  59.  
  60. void output(pitem t){
  61.     if(!t) return;
  62.  
  63.     output(t->l);
  64.     cout << t->x << " " << t->y << " " << t->z << endl;
  65.     output(t->r);
  66. }
  67.  
  68. map<pii, int> cntL, cntD;
  69. int main(){
  70.     int n; scanf("%d", &n);
  71.  
  72.     pitem lunch = new item();
  73.     pitem dinner = new item();
  74.     for(int i = 0; i < n; i++){
  75.         int a, b; scanf("%d %d", &a, &b);
  76.         if(i == 0) {
  77.             lunch = create(a, b, ++cntL[mp(a, b)]);
  78.             dinner = create(b, a, ++cntD[mp(b, a)]);
  79.         }else{
  80.             pitem r; split(lunch, lunch, r, mp(a, mp(b, INF)));
  81.             merge(lunch, lunch, create(a, b, ++cntL[mp(a, b)]));
  82.             merge(lunch, lunch, r);
  83.             cout << "Lunch\n";
  84.             output(lunch);
  85.  
  86.  
  87.             split(dinner, dinner, r, mp(b, mp(a, INF)));
  88.             merge(dinner, dinner, create(b, a, ++cntD[mp(b, a)]));
  89.             merge(dinner, dinner, r);
  90.              cout << "Dinner\n";
  91.             output(dinner);
  92.         }
  93.     }
  94.  
  95.     for(int i = 1; i <= n; i++){
  96.         pitem r; split(lunch, lunch, r, mp(a, mp(b, INF)));
  97.         pitem equals; split(lunch, lunch, equals, mp(a, mp(b-1, INF)));
  98.         pitem one; split(equals, equals, one, mp(a, mp(b, equals->cnt-1)));
  99.         merge(lunch, lunch, equals);
  100.         merge(lunch, lunch, r);
  101.  
  102.         split(dinner, dinner, r, mp(b, mp(a, INF)));
  103.         split(dinner, dinner, equals, mp(b, mp(a-1, INF)));
  104.         split(equals, equals, one, mp(b, mp(a, equals->cnt-1)));
  105.         merge(dinner, dinner, equals);
  106.         merge(dinner, dinner, r);
  107.        
  108.         cout << "Lunch\n";
  109.         output(lunch);
  110.     }
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement