EntropyIncreaser

NOIP2017 phalanx2

Dec 9th, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3.  
  4. #define LOG(FMT...) // fprintf(stderr, FMT)
  5.  
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9.  
  10. struct node {
  11.     int l, r, sum;
  12.     ll d;
  13.     node *ls, *rs;
  14. };
  15.  
  16. struct que {
  17.     int step, sz, used;
  18.     ll fst;
  19.     node* root;
  20.  
  21.     ll get(int rk);
  22.     void put(ll x);
  23. };
  24.  
  25. const int N = 300010;
  26.  
  27. int n, m, q;
  28. que q1[N], q2;
  29.  
  30. node* create(int l, int r, int sum, ll d);
  31.  
  32. int main() {
  33. //  freopen("test.out", "w", stdout);
  34.     int x, y;
  35.     ll i1, i2;
  36.     scanf("%d%d%d", &n, &m, &q);
  37.     for (int i = 1; i <= n; ++i) {
  38.         q1[i].sz = q1[i].used = m - 1;
  39.         q1[i].step = 1;
  40.         q1[i].fst = (ll)(i - 1) * m;
  41.         q1[i].root = create(1, q1[i].sz + q, q1[i].sz, 0);
  42.         q1[i].root->ls = create(1, q1[i].sz, q1[i].sz, 0);
  43.         q1[i].root->rs = create(m, q1[i].sz + q, 0, 0);
  44.     }
  45.     q2.sz = q2.used = n;
  46.     q2.step = m;
  47.     q2.fst = 0;
  48.     q2.root = create(1, n + q, n, 0);
  49.     q2.root->ls = create(1, n, n, 0);
  50.     q2.root->rs = create(n + 1, n + q, 0, 0);
  51.     while (q--) {
  52.         scanf("%d%d", &x, &y);
  53.         if (y == m) {
  54.             i1 = q2.get(x);
  55.             q2.put(i1);
  56.             printf("%lld\n", i1);
  57.         } else {
  58.             i1 = q1[x].get(y);
  59.             i2 = q2.get(x);
  60.             q1[x].put(i2);
  61.             q2.put(i1);
  62.             printf("%lld\n", i1);
  63.         }
  64.         LOG("%d\n", q);
  65.     }
  66.     return 0;
  67. }
  68.  
  69. inline node* create(int l, int r, int sum, ll d) {
  70.     static node pool[N << 5];
  71.     static node* p = pool;
  72.     ++p;
  73.     p->l = l;
  74.     p->r = r;
  75.     p->sum = sum;
  76.     LOG("%d %d\n", l, r);
  77.     LOG("%d\n", sum);
  78.     p->d = d;
  79.     return p;
  80. }
  81.  
  82. ll que::get(int rk) {
  83.     node* p = root;
  84.     while (p->l != p->r) {
  85.         LOG("%d %d %d\n", p->l, p->r, rk);
  86.         --p->sum;
  87.         if (!p->ls) {
  88.             int mid = (p->l + p->r) >> 1;
  89.             p->ls = create(p->l, mid, mid - p->l + 1, 0);
  90.             p->rs = create(mid + 1, p->r, p->r - mid, 0);
  91.         }
  92.         LOG("%d %d\n", p->ls->l, p->ls->r);
  93.         if (rk <= p->ls->sum)
  94.             p = p->ls;
  95.         else {
  96.             rk -= p->ls->sum;
  97.             p = p->rs;
  98.         }
  99.     }
  100.     p->sum = 0;
  101.     if (p->l <= sz)
  102.         return (ll)step * p->l + fst;
  103.     return p->d;
  104. }
  105.  
  106. void que::put(ll x) {
  107.     node* p = root;
  108.     ++used;
  109.     while (p->l != p->r) {
  110.         ++p->sum;
  111.         if (!p->ls) {
  112.             int mid = (p->l + p->r) >> 1;
  113.             p->ls = create(p->l, mid, 0, 0);
  114.             p->rs = create(mid + 1, p->r, 0, 0);
  115.         }
  116.         if (p->ls->r >= used)
  117.             p = p->ls;
  118.         else
  119.             p = p->rs;
  120.     }
  121.     p->sum = 1;
  122.     p->d = x;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment