Advertisement
Tbl_Mne_Ne_Dryg

Untitled

Dec 24th, 2022
997
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5. const int maxn = 1 << 20;
  6.  
  7. struct node {
  8.   int mn = INT_MAX;
  9.   int imn = -1;
  10.   static node combine(node a, node b) {
  11.     node c;
  12.     if (a.mn < b.mn) {
  13.       c.mn = a.mn;
  14.       c.imn = a.imn;
  15.     } else {
  16.       c.mn = b.mn;
  17.       c.imn = b.imn;
  18.     }
  19.     return c;
  20.   }
  21. };
  22.  
  23. struct segtree {
  24.   vector<node> tree;
  25.   segtree() {
  26.     tree.resize(maxn * 2 - 1);
  27.   }
  28.   void build(int x, int l, int r, const vector<int>& a, int ch) {
  29.     if (l == r) {
  30.       if (l < a.size() && l % 2 == ch) {
  31.         tree[x].mn = a[l];
  32.         tree[x].imn = l;
  33.       }
  34.       return;
  35.     }
  36.     int mid = (l + r) >> 1;
  37.     build(2 * x + 1, l, mid, a, ch);
  38.     build(2 * x + 2, mid + 1, r, a, ch);
  39.     tree[x] = node::combine(tree[2 * x + 1], tree[2 * x + 2]);
  40.   }
  41.   node get(int x, int l, int r, int ll, int rr) {
  42.     if (r < ll || rr < l)
  43.       return {};
  44.     if (ll <= l && r <= rr)
  45.       return tree[x];
  46.     int mid = (l + r) >> 1;
  47.     return node::combine(get(2 * x + 1, l, mid, ll, rr),
  48.                          get(2 * x + 2, mid + 1, r, ll, rr));
  49.   }
  50. };
  51.  
  52. vector<segtree> sg(2);
  53. vector<pair<int, int>> val;
  54. vector<vector<int>> rg;
  55. vector<int> deg;
  56.  
  57. int c = -1;
  58. void rec(int l, int r, int p) {
  59.   if (l > r)
  60.     return;
  61.   auto [aL, L] = sg[l % 2].get(0, 0, maxn - 1, l, r);
  62.   auto [aR, R] = sg[r % 2].get(0, 0, maxn - 1, L, r);
  63.   c += 1;
  64.   val[c] = {aL, aR};
  65.   if (p != -1) {
  66.     rg[p].push_back(c);
  67.     deg[c] += 1;
  68.   }
  69.   rec(L + 1, R - 1, c);
  70.   rec(l, L - 1, p);
  71.   rec(R + 1, r, p);
  72. }
  73.  
  74. signed main() {
  75.   ios::sync_with_stdio(false);
  76.   cin.tie(0);
  77. #ifdef LOCAL
  78.   freopen("input", "r", stdin);
  79. #endif
  80.   int n, k;
  81.   cin >> n >> k;
  82.   rg.resize(n / 2);
  83.   deg.resize(n / 2);
  84.   val.resize(n / 2);
  85.   vector<int> a(n);
  86.   for (auto& i : a)
  87.     cin >> i;
  88.   for (int i = 0; i < 2; i++)
  89.     sg[i].build(0, 0, maxn - 1, a, i);
  90.   rec(0, n - 1, -1);
  91.   deque<int> ans;
  92.   set<pair<pair<int, int>, int>> q;
  93.   for (int i = 0; i < n / 2; i++)
  94.     if (deg[i] == 0)
  95.       q.emplace(val[i], i);
  96.   while (!q.empty()) {
  97.     auto x = *q.begin();
  98.     q.erase(q.begin());
  99.     ans.push_back(x.first.first);
  100.     ans.push_back(x.first.second);
  101.     for (auto& to : rg[x.second]) {
  102.       deg[to]--;
  103.       if (deg[to] == 0) {
  104.         q.emplace(val[to], to);
  105.       }
  106.     }
  107.   }
  108.   assert(ans.size() == n);
  109.   ans.resize(k);
  110.   for (auto& i : ans) cout << i << ' ';
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement