#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, pol_n, dl, reszta, gdzie, result;
int tab[45];
int res[45];
long long ile[45];
int potegi[30];
int F[1100000];
int F_dl[1100000];
vector <int> jedynki[1100000];
vector <int>::iterator it;
int S[1100000];
int S_dl[1100000];
int jedynka[1100000];
int T[25][1100000];
int main ()
{
potegi[0] = 1;
for (int i = 1; i < 30; ++i) potegi[i] = 2 * potegi[i - 1];
scanf("%d", &n);
for (int i = 1; i <= n; ++i) res[i] = 1000000000;
pol_n = n / 2;
reszta = n - pol_n;
for (int i = 0; i < n; ++i)
{
scanf("%d", &tab[i]);
tab[i]--;
}
if (n == 1)
{
printf("0 1\n");
return 0;
}
for (int i = 1; i < potegi[pol_n]; ++i)
{
gdzie = 0;
while (!(i & potegi[gdzie])) gdzie++;
F[i] = F[i ^ potegi[gdzie]];
jedynki[i].push_back(gdzie);
F_dl[i] = 1;
for (int j = gdzie + 1; j < pol_n; ++j) if (i & potegi[j])
{
jedynki[i].push_back(j);
F_dl[i]++;
if (tab[gdzie] > tab[j]) F[i]++;
}
}
for (int i = 1; i < potegi[reszta]; ++i)
{
gdzie = 0;
while (!(i & potegi[gdzie])) gdzie++;
S[i] = S[i ^ potegi[gdzie]];
jedynka[i] = gdzie;
S_dl[i] = 1;
for (int j = gdzie + 1; j < reszta; ++j) if (i & potegi[j])
{
S_dl[i]++;
if (tab[gdzie + pol_n] > tab[j + pol_n]) S[i]++;
}
}
for (int i = 0; i < pol_n; ++i) for (int j = 1; j < potegi[reszta]; ++j)
{
T[i][j] = T[i][j ^ potegi[jedynka[j]]];
if (tab[i] > tab[jedynka[j] + pol_n]) T[i][j]++;
}
for (int i = 0; i < potegi[pol_n]; ++i) for (int j = 0; j < potegi[reszta]; ++j)
{
result = F[i] + S[j];
dl = F_dl[i] + S_dl[j];
for (it = jedynki[i].begin(); it != jedynki[i].end(); ++it) result += T[*it][j];
if (result < res[dl])
{
res[dl] = result;
ile[dl] = 1;
}
else if (result == res[dl]) ile[dl]++;
}
for (int i = 1; i <= n; ++i) printf("%d %lld\n", res[i], ile[i]);
return 0;
}