Pagini recente » Istoria paginii runda/wellcodesimulareclasa9-10martie | Cod sursa (job #2675958) | Cod sursa (job #617006) | Istoria paginii runda/rar31 | Cod sursa (job #1337628)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector <int> V;
void Reverse(int l, int r)
{
if (l >= r) return;
printf("%d %d\n", l + 1, r + 1);
reverse(V.begin() + l, V.begin() + r + 1);
}
int getSolve(int l, int r, int b, int from)
{
if (l == r) return from == bool(V[l] & 1 << b);
int m = l + r >> 1;
int u = getSolve(l, m, b, from);
int v = getSolve(m + 1, r, b, 1 - from);
int res = u + r - m - v;
if (res && res != r - l + 1 && r - m - v) {
Reverse(l + u, r);
}
return res;
}
void mainSolve(int l, int r, int b)
{
if (l >= r) return;
if (b < 0) return;
int m = l + getSolve(l, r, b, 0) - 1;
mainSolve(l, m, b - 1);
mainSolve(m + 1, r, b - 1);
}
int main()
{
freopen("invsort.in", "r", stdin);
freopen("invsort.out", "w", stdout);
scanf("%d", &n); V.resize(n);
for (int i = 0; i < n; i++)
scanf("%d", &V[i]);
mainSolve(0, n - 1, 14);
return 0;
}