Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- struct sqrt_decomposition {
- vector<vector<int>> blocks;
- vector<int> block_max;
- int n;
- int max_block_size = 256;
- pair<int, int> find_element(int pos) {
- int cur_block = 0;
- --pos;
- while ((int) blocks[cur_block].size() <= pos) {
- pos -= (int) blocks[cur_block].size();
- ++cur_block;
- }
- return make_pair(cur_block, pos);
- }
- void erase(int pos) {
- auto[block, pos_in_block] = find_element(pos);
- blocks[block].erase(blocks[block].begin() + pos_in_block);
- block_max[block] = INT_MIN;
- for (int i = 0; i < (int) blocks[block].size(); ++i) {
- block_max[block] = max(block_max[block], blocks[block][i]);
- }
- }
- int get(int l, int r) {
- int ans = INT_MIN;
- auto[l_block, l_pos_in_block] = find_element(l);
- auto[r_block, r_pos_in_block] = find_element(r);
- for (int cur_block = l_block + 1; cur_block < r_block; ++cur_block) {
- ans = max(ans, block_max[cur_block]);
- }
- l = l_pos_in_block, r = r_pos_in_block;
- if (l_block == r_block) {
- for (l; l <= r; ++l) {
- ans = max(ans, blocks[l_block][l]);
- }
- } else {
- for (l; l < (int) blocks[l_block].size(); ++l) {
- ans = max(ans, blocks[l_block][l]);
- }
- for (r; r >= 0; --r) {
- ans = max(ans, blocks[r_block][r]);
- }
- }
- return ans;
- }
- sqrt_decomposition(vector<int> &a) {
- blocks.push_back({});
- block_max.push_back(INT_MIN);
- for (int i = 0; i < (int) a.size(); ++i) {
- blocks.back().push_back(a[i]);
- block_max.back() = max(block_max.back(), a[i]);
- if ((int) blocks.back().size() == max_block_size) {
- blocks.push_back({});
- block_max.push_back(INT_MIN);
- }
- }
- n = (int) blocks.size();
- }
- };
- signed main() {
- ios_base::sync_with_stdio(false), cin.tie(nullptr);
- int n;
- cin >> n;
- vector<int> a(n);
- for (auto &i: a) {
- cin >> i;
- }
- sqrt_decomposition sq(a);
- for(int i = 0; i < n; ++i) {
- cout << sq.get(1, n - i) << ' ';
- sq.erase(1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment