Guest User

Untitled

a guest
Nov 5th, 2025
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct sqrt_decomposition {
  6.     vector<vector<int>> blocks;
  7.     vector<int> block_max;
  8.  
  9.     int n;
  10.     int max_block_size = 256;
  11.  
  12.     pair<int, int> find_element(int pos) {
  13.         int cur_block = 0;
  14.         --pos;
  15.         while ((int) blocks[cur_block].size() <= pos) {
  16.             pos -= (int) blocks[cur_block].size();
  17.             ++cur_block;
  18.         }
  19.         return make_pair(cur_block, pos);
  20.     }
  21.  
  22.     void erase(int pos) {
  23.         auto[block, pos_in_block] = find_element(pos);
  24.         blocks[block].erase(blocks[block].begin() + pos_in_block);
  25.         block_max[block] = INT_MIN;
  26.         for (int i = 0; i < (int) blocks[block].size(); ++i) {
  27.             block_max[block] = max(block_max[block], blocks[block][i]);
  28.         }
  29.     }
  30.  
  31.     int get(int l, int r) {
  32.         int ans = INT_MIN;
  33.         auto[l_block, l_pos_in_block] = find_element(l);
  34.         auto[r_block, r_pos_in_block] = find_element(r);
  35.         for (int cur_block = l_block + 1; cur_block < r_block; ++cur_block) {
  36.             ans = max(ans, block_max[cur_block]);
  37.         }
  38.         l = l_pos_in_block, r = r_pos_in_block;
  39.         if (l_block == r_block) {
  40.             for (l; l <= r; ++l) {
  41.                 ans = max(ans, blocks[l_block][l]);
  42.             }
  43.         } else {
  44.             for (l; l < (int) blocks[l_block].size(); ++l) {
  45.                 ans = max(ans, blocks[l_block][l]);
  46.             }
  47.             for (r; r >= 0; --r) {
  48.                 ans = max(ans, blocks[r_block][r]);
  49.             }
  50.         }
  51.         return ans;
  52.     }
  53.  
  54.  
  55.     sqrt_decomposition(vector<int> &a) {
  56.         blocks.push_back({});
  57.         block_max.push_back(INT_MIN);
  58.         for (int i = 0; i < (int) a.size(); ++i) {
  59.             blocks.back().push_back(a[i]);
  60.             block_max.back() = max(block_max.back(), a[i]);
  61.             if ((int) blocks.back().size() == max_block_size) {
  62.                 blocks.push_back({});
  63.                 block_max.push_back(INT_MIN);
  64.             }
  65.         }
  66.         n = (int) blocks.size();
  67.     }
  68. };
  69.  
  70. signed main() {
  71.     ios_base::sync_with_stdio(false), cin.tie(nullptr);
  72.     int n;
  73.     cin >> n;
  74.     vector<int> a(n);
  75.     for (auto &i: a) {
  76.         cin >> i;
  77.     }
  78.     sqrt_decomposition sq(a);
  79.     for(int i = 0; i < n; ++i) {
  80.         cout << sq.get(1, n - i) << ' ';
  81.         sq.erase(1);
  82.     }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment