Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- int main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif // LOCAL
- ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
- int n;
- cin >> n;
- int a[n], b[n], c[n];
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- b[i] = a[i];
- }
- sort(b, b + n);
- vector<pair<int, int>> res;
- auto reshuf = [&](int l, int r) {
- int m = (l + r + 1) / 2;
- for (int i = l; i < m; ++i) {
- c[l + 1 + (i - l) * 2] = b[i];
- }
- for (int i = m; i <= r; ++i) {
- c[l + (i - m) * 2] = b[i];
- }
- for (int i = l; i <= r; ++i)
- b[i] = c[i];
- };
- mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
- vector<pair<int, int>> qwerty;
- reshuf(0, n - 1);
- qwerty.push_back({0, n - 1});
- int ddd = 1000;
- for (int i = 0; i < ddd; ++i) {
- int l = rnd() % n, r = rnd() % n;
- if (l == r) continue;
- if (l > r) swap(l, r);
- reshuf(l, r);
- qwerty.push_back({l, r});
- }
- reshuf(0, n - 1);
- qwerty.push_back({0, n - 1});
- auto shuf = [&](int l, int r) {
- int t;
- for (int i = l + 1; i <= r; i += 2)
- c[(i - l) / 2] = a[i], t = (i - l) / 2;
- for (int i = l; i <= r; i += 2)
- c[t + 1 + (i - l) / 2] = a[i];
- for (int i = 0; i < r - l + 1; ++i)
- a[l + i] = c[i];
- };
- int r = 0;
- for (int i = 0; i < n; ++i) {
- while (a[i] != b[i]) {
- int j = i + 1;
- while (n - 1 <= 2 * j - i - 1 && !(b[j] == a[i] || b[j] == a[i + 1])) j++;
- if (b[j] == a[i]) {
- qwerty.push_back({i, 2 * j - i - 1});
- reshuf(i, 2 * j - i - 1);
- continue;
- } else if (b[j] == a[i + 1]) {
- qwerty.push_back({i, 2 * j - i - 1});
- reshuf(i, 2 * j - i - 1);
- res.push_back({i, i + 1});
- swap(a[i], a[i + 1]);
- continue;
- }
- j = i + 1;
- while (a[j] != b[i]) j++;
- if ((i + j) % 2 == 1)
- r = 0, res.push_back({i, j + r}), shuf(i, j + r);
- else
- r = 0, res.push_back({i + 1, j + r}), shuf(i + 1, j + r);
- }
- }
- reverse(qwerty.begin(), qwerty.end());
- for (auto i: qwerty)
- res.push_back(i);
- cout << res.size() << endl;
- if (res.size() > 15000)
- return -1;
- for (auto i: res)
- cout << i.first + 1 << " " << i.second + 1 << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement