Cod sursa(job #1337628)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 9 februarie 2015 11:58:43
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#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;
}