Pagini recente »
Istoria paginii utilizator/iulia2100
|
Rating Nicolaescu David Gabriel (David_Gabriel)
|
Istoria paginii utilizator/nicu
|
Istoria paginii utilizator/adrianrau
|
Cod sursă (job #161189)
Cod sursă (job
#161189)
#include <cstdio>
int v[10005], p2[20], po[10005];
struct sp
{
int val;
int norm;
} vl[10005], v2[10005];
int main() {
freopen("specsort.in", "r", stdin);
freopen("specsort.out", "w", stdout);
int n, m, i, j, nr, x;
scanf("%d", &n);
p2[0] = 1;
for (i = 1; i <= 19; i++)
p2[i] = p2[i - 1] * 2;
for (i = 1; i <= n; i++)
{
scanf("%d", &v[i]);
po[v[i]] = i;
vl[i].val = v[i];
}
nr = 0;
vl[po[1]].norm = 0;
for (i = 2; i <= n; i++)
{
if (po[i - 1] < po[i])
vl[po[i]].norm = vl[po[i - 1]].norm;
else {
nr++;
vl[po[i]].norm = nr;
}
}
for (i = 0; i <= 19; i++)
if (nr & p2[i])
x = i;
//printf("%d\n", nr);
//printf("%d\n", x + 1);
//for (i = 1; i <= n; i++)
// printf("%d ", vl[i].norm);
//printf("\n");
//for (i = 1; i <= n; i++)
// printf("%d ", v[i]);
//printf("\n");
for (i = 0; i <= x; i++)
{
m = 0;
for (j = 1; j <= n; j++)
if (!(vl[j].norm & p2[i]))
{
m++;
v2[m] = vl[j];
}
for (j = 1; j <= n; j++)
{
if (vl[j].norm & p2[i])
{
m++;
v2[m] = vl[j];
}
vl[j] = v2[j];
printf("%d ", vl[j].val);
}
printf("\n");
}
return 0;
}