Advertisement
ivnikkk

Untitled

Dec 30th, 2022
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. typedef long double ld;
  6. const int inf = 1e9;
  7. struct Segtree {
  8.     struct node {
  9.         int val, ind;
  10.         node() {
  11.             val = inf, ind = -1;
  12.         }
  13.     };
  14.     vector<node> t;
  15.     int n;
  16.     Segtree(int _n) :n(_n) {
  17.         t.resize(4 * n, node());
  18.     }
  19.     node cmin(const node& lhs, const node& rhs) {
  20.         if (lhs.val > rhs.val) return rhs;
  21.         return lhs;
  22.     }
  23.     void update(int v, int tl, int tr, int pos, int x) {
  24.         if (tl == tr) {
  25.             t[v].val = x;
  26.             t[v].ind = pos;
  27.             return;
  28.         }
  29.         int tm = (tl + tr) / 2;
  30.         if (pos <= tm) { update(v * 2, tl, tm, pos, x); }
  31.         else { update(v * 2 + 1, tm + 1, tr, pos, x); }
  32.         t[v] = cmin(t[v * 2], t[v * 2 + 1]);
  33.     }
  34.     node get_min(int v, int tl, int tr, int l, int r) {
  35.         if (tl > r || tr < l) { return node(); }
  36.         if (tl >= l && tr <= r) { return t[v]; }
  37.         int tm = (tl + tr) / 2;
  38.         return cmin(get_min(v * 2, tl, tm, l, r), get_min(v * 2 + 1, tm + 1, tr, l, r));
  39.     }
  40. };
  41. int n;
  42. struct w_edge {
  43.     int val1, val2;
  44.     w_edge(int _v1, int _v2) :val1(_v1), val2(_v2) {};
  45. };
  46.  
  47. vector<vector<pair<int, w_edge>>> gr;
  48. int count_vertex = 0;
  49. void merge(int l, int r, Segtree& odd_t, Segtree& ev_t, int pred) {
  50.     if (r <= l)return;
  51.     if (l % 2 == 1) {
  52.         Segtree::node i = odd_t.get_min(1, 0, n - 1, l, r);
  53.         Segtree::node j = ev_t.get_min(1, 0, n - 1, i.ind, r);
  54.         gr[pred].push_back({ count_vertex++, w_edge(i.val, j.val) });
  55.         odd_t.update(1, 0, n - 1, i.ind, inf);
  56.         ev_t.update(1, 0, n - 1, j.ind, inf);
  57.         int now = count_vertex - 1;
  58.         if (l < i.ind - 1) { merge(l, i.ind - 1, odd_t, ev_t, now); }
  59.         merge(i.ind + 1, j.ind - 1, odd_t, ev_t, now);
  60.         if (j.ind + 1 < r) { merge(j.ind + 1, r, odd_t, ev_t, now); }
  61.     }
  62.     else {
  63.         Segtree::node i = ev_t.get_min(1, 0, n - 1, l, r);
  64.         Segtree::node j = odd_t.get_min(1, 0, n - 1, i.ind, r);
  65.         gr[pred].push_back({ count_vertex++, w_edge(i.val, j.val) });
  66.         ev_t.update(1, 0, n - 1, i.ind, inf);
  67.         odd_t.update(1, 0, n - 1, j.ind, inf);
  68.         int now = count_vertex - 1;
  69.         if (l < i.ind - 1) { merge(l, i.ind - 1, odd_t, ev_t, now); }
  70.         merge(i.ind + 1, j.ind - 1, odd_t, ev_t, now);
  71.         if (j.ind + 1 < r) { merge(j.ind + 1, r, odd_t, ev_t, now); }
  72.     }
  73. }
  74.  
  75. signed main() {
  76. #ifdef _DEBUG
  77.     freopen("input.txt", "r", stdin);
  78.     freopen("output.txt", "w", stdout);
  79. #endif
  80.     ios_base::sync_with_stdio(false);
  81.     cin.tie(nullptr);
  82.     cout.tie(nullptr);
  83.     cin >> n;
  84.     int k; cin >> k;
  85.     Segtree odd_t(n), ev_t(n);
  86.     gr.resize(n);
  87.     for (int i = 0; i < n; i++) {
  88.         int x; cin >> x;
  89.         if (i % 2 == 0) {
  90.             ev_t.update(1, 0, n - 1, i, x);
  91.             odd_t.update(1, 0, n - 1, i, inf);
  92.         }
  93.         else {
  94.             ev_t.update(1, 0, n - 1, i, inf);
  95.             odd_t.update(1, 0, n - 1, i, x);
  96.         }
  97.     }
  98.     {
  99.         Segtree::node i = ev_t.get_min(1, 0, n - 1, 0, n - 1);
  100.         Segtree::node j = odd_t.get_min(1, 0, n - 1, i.ind, n - 1);
  101.         gr[count_vertex].push_back({ count_vertex + 1, w_edge(i.val, j.val) });
  102.         count_vertex += 2;
  103.         ev_t.update(1, 0, n - 1, i.ind, inf);
  104.         odd_t.update(1, 0, n - 1, j.ind, inf);
  105.         if (0 < i.ind - 1) { merge(0, i.ind - 1, odd_t, ev_t, 1); }
  106.         merge(i.ind + 1, j.ind - 1, odd_t, ev_t, 1);
  107.         if (j.ind + 1 < n - 1) { merge(j.ind + 1, n - 1, odd_t, ev_t, 1); }
  108.     }
  109.     set <pair<int, pair<int, int>>> q;
  110.     q.insert({ -1,{-1, 0} });
  111.     while (!q.empty()) {
  112.         auto f = *q.begin();
  113.         if (f.first != -1) {
  114.             if (k) {
  115.                 cout << f.first << ' ';
  116.                 k--;
  117.             }
  118.             if (k) {
  119.                 cout << f.second.first << ' ';
  120.                 k--;
  121.             }
  122.             if (k == 0) {
  123.                 break;
  124.             }
  125.         }
  126.         q.erase(q.begin());
  127.         for (pair<int, w_edge>& u : gr[f.second.second]) {
  128.             q.insert({ u.second.val1,{u.second.val2, u.first} });
  129.         }
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement