Advertisement
Tbl_Mne_Ne_Dryg

Untitled

Dec 25th, 2022
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. #define ll long long
  4. #define ld long double
  5.  
  6. using namespace std;
  7.  
  8. const ll inf = 1e18;
  9.  
  10. ll n, k;
  11. vector<ll> a;
  12. vector<vector<vector<ll>>> dp;
  13.  
  14. ll step[20];
  15.  
  16. vector<ll> siz;
  17.  
  18. void buildStep() {
  19.     step[0] = 1;
  20.     siz = vector<ll>((1ll << 21), 0);
  21.     siz[step[0]] = 0;
  22.     for (ll i = 1; i < 20; i++) {
  23.         step[i] = step[i - 1] * 2;
  24.         siz[step[i]] = i;
  25.     }
  26.     for (ll i = 2; i < (1ll << 21); i++) {
  27.         if (siz[i] == 0) {
  28.             siz[i] = siz[i - 1];
  29.         }
  30.     }
  31. }
  32.  
  33. void read() {
  34.     cin >> n >> k;
  35.     a = vector<ll>(n);
  36.     for (ll i = 0; i < n; i++) {
  37.         cin >> a[i];
  38.     }
  39. }
  40.  
  41. ll minn(ll ind1, ll ind2) {
  42.     if (ind1 == -1) {
  43.         return ind2;
  44.     }
  45.     if (ind2 == -1) {
  46.         return ind1;
  47.     }
  48.     if (a[ind1] < a[ind2]) {
  49.         return ind1;
  50.     } else {
  51.         return ind2;
  52.     }
  53. }
  54.  
  55. void buildDp() {
  56.     dp = vector<vector<vector<ll>>>(2, vector<vector<ll>>(20, vector<ll>(n, -1)));
  57.     for (ll i = 0; i < n; i += 2) {
  58.         dp[0][0][i] = i;
  59.     }
  60.     for (ll i = 1; i < n; i += 2) {
  61.         dp[1][0][i] = i;
  62.     }
  63.     for (ll j = 1; j < 20; j++) {
  64.         for (ll i = 0; i < n; i++) {
  65.             dp[0][j][i] = dp[0][j - 1][i];
  66.             dp[1][j][i] = dp[1][j - 1][i];
  67.             if (i - step[j - 1] >= 0) {
  68.                 dp[0][j][i] = minn(dp[0][j][i], dp[0][j - 1][i - step[j - 1]]);
  69.                 dp[1][j][i] = minn(dp[1][j][i], dp[1][j - 1][i - step[j - 1]]);
  70.             }
  71.         }
  72.     }
  73. }
  74.  
  75. ll getMin(ll ind, ll l, ll r) {
  76.     if (r < l) return inf;
  77.     ll curSiz = r - l + 1;
  78.     return minn(dp[ind][siz[curSiz]][r], dp[ind][siz[curSiz]][l + step[siz[curSiz]] - 1]);
  79. }
  80.  
  81. pair<ll, ll> getPair(ll ind, ll l, ll r) {
  82.     //if (r > l) return { inf, inf };
  83.     ll ind1 = getMin(ind, l, r);
  84.     ll ind2 = getMin(1 - ind, ind1, r);
  85.     return { ind1, ind2 };
  86. }
  87.  
  88. vector<ll> u;
  89. vector<pair<ll, ll>> p;
  90. ll sum = 1;
  91.  
  92. void f(ll ind, ll l, ll r) {
  93.     if (r < l) {
  94.         return;
  95.     }
  96.     pair<ll, ll> cur = getPair(ind, l, r);
  97.     f(ind, l, cur.first - 1);
  98.     f(1 - ind, cur.first + 1, cur.second - 1);
  99.     f(ind, cur.second + 1, r);
  100.     p.push_back(cur);
  101.     u[cur.first] = sum;
  102.     u[cur.second] = -sum;
  103.     sum++;
  104. }
  105.  
  106. int main() {
  107.     ios::sync_with_stdio(false);
  108.     cin.tie(0);
  109.  
  110.     //freopen("input.txt", "r", stdin);
  111.  
  112.     read();
  113.     buildStep();
  114.     buildDp();
  115.     u = vector<ll>(n, 0);
  116.     p.push_back({ 0, 0 });
  117.     f(0, 0, n - 1);
  118.     vector<ll> s;
  119.     vector<vector<ll>> gr(n / 2 + 1);
  120.     vector<ll> c(n + 1, 0);
  121.     for (ll i = 0; i < n; i++) {
  122.         //cout << u[i] << ' ';      
  123.         if (u[i] > 0) {
  124.             s.push_back(i);
  125.         } else {
  126.             if (u[s.back()] != abs(u[i])) {
  127.                 return 1;
  128.             }
  129.             s.pop_back();
  130.             if (!s.empty()) {
  131.                 gr[-u[i]].push_back(u[s.back()]);
  132.                 c[u[s.back()]]++;
  133.             }  
  134.         }
  135.     }
  136.     //return 0;
  137.     set<pair<ll, ll>> q;
  138.     for (ll i = 1; i <= n / 2; i++) {
  139.         if (c[i] == 0) {
  140.             q.insert({a[p[i].first], i });
  141.         }
  142.     }
  143.     deque<ll> d;
  144.     while (!q.empty()) {
  145.         ll cur = prev(q.end())->second;
  146.         d.push_front(a[p[cur].second]);
  147.         d.push_front(a[p[cur].first]);
  148.         q.erase(prev(q.end()));
  149.         for (auto& to : gr[cur]) {
  150.             c[to]--;
  151.             if (c[to] == 0) {
  152.                 q.insert({ a[p[to].first], to });
  153.             }
  154.         }
  155.     }
  156.     for (ll i = 0; i < k; i++) {
  157.         cout << d[i] << ' ';
  158.     }
  159.  
  160.     return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement