# include <bits/stdc++.h>
using namespace std;
void HeapAdjust ( int * a, int i, int n)
{
int lchild = 2 * i;
int rchild = 2 * i + 1 ;
int max = i;
if ( i <= n / 2 ) {
if ( lchild <= n && a[ lchild] > a[ max] )
max = lchild;
if ( rchild <= n && a[ rchild] > a[ max] )
max = rchild;
if ( max != i) {
swap ( a[ i] , a[ max] ) ;
HeapAdjust ( a, max, n) ;
}
}
}
void BuildHeap ( int * a, int n)
{
for ( int i = n / 2 ; i >= 1 ; i-- ) {
HeapAdjust ( a, i, n) ;
}
}
void HeapSort ( int * a, int n)
{
BuildHeap ( a, n) ;
for ( int i = n; i > 1 ; i-- ) {
swap ( a[ 1 ] , a[ i] ) ;
HeapAdjust ( a, 1 , i - 1 ) ;
for ( int j = 1 ; j <= n; j++ ) {
if ( j == 1 )
cout << a[ j] ;
else
cout << " " << a[ j] ;
}
cout << endl;
}
}
int main ( )
{
int a[ 100 ] , n;
while ( ~ scanf ( "%d" , & n) ) {
for ( int i = 1 ; i <= n; i++ )
cin >> a[ i] ;
HeapSort ( a, n) ;
}
return 0 ;
}
# include <stdio.h>
# include <string.h>
int Judge ( int a[ ] , int b[ ] , int n) {
int i, flag= 0 , pos= 0 ;
for ( i= 1 ; i< n; i++ ) {
if ( b[ i- 1 ] <= b[ i] ) {
flag= 1 ;
} else {
pos= i;
break ;
}
}
if ( flag) {
for ( i= pos; i< n; i++ ) {
if ( a[ i] != b[ i] ) {
pos= 0 ;
break ;
}
}
} else
pos= 0 ;
return pos;
}
void NextInsertionSort ( int a[ ] , int pos, int n) {
int i, tmp= a[ pos] ;
int index;
for ( i= 0 ; i< pos; i++ ) {
if ( a[ i] > tmp) {
index= i;
break ;
}
}
for ( i= pos- 1 ; i>= index; i-- ) {
a[ i+ 1 ] = a[ i] ;
}
a[ index] = tmp;
}
int k= 0 ;
void Merge ( int a[ ] , int low, int high, int mid) {
int i, j;
int c[ 100 ] = { 0 } ;
for ( i= low; i<= high; i++ ) {
c[ i] = a[ i] ;
}
i= low, j= mid+ 1 ;
while ( i<= mid&& j<= high) {
if ( c[ i] <= c[ j] ) {
a[ k++ ] = c[ i] ;
i++ ;
} else {
a[ k++ ] = c[ j] ;
j++ ;
}
}
while ( i<= mid) {
a[ k++ ] = c[ i] ;
i++ ;
}
while ( j<= high) {
a[ k++ ] = c[ j] ;
j++ ;
}
}
int GetMergeLen ( int a[ ] , int n) {
int i, j;
for ( j= 2 ; j<= n; j*= 2 ) {
for ( i= j; i< n; i= i+ 2 * j)
{
if ( a[ i- 1 ] > a[ i] )
break ;
}
if ( i< n)
break ;
}
return j;
}
void NextMergeSort ( int a[ ] , int low, int high, int len) {
int i;
for ( i= low; i<= high; i+= len) {
int mid= ( i+ i+ len- 1 ) / 2 ;
if ( i+ len- 1 <= high) {
Merge ( a, i, i+ len- 1 , mid) ;
}
else if ( mid< high) {
Merge ( a, i, high, mid) ;
}
}
}
int main ( ) {
int n;
scanf ( "%d" , & n) ;
int i;
int a[ n] , b[ n] ;
memset ( a, 0 , sizeof ( a) ) ;
memset ( b, 0 , sizeof ( b) ) ;
for ( i= 0 ; i< n; i++ ) {
scanf ( "%d" , & a[ i] ) ;
}
for ( i= 0 ; i< n; i++ ) {
scanf ( "%d" , & b[ i] ) ;
}
int pos= Judge ( a, b, n) ;
if ( pos) {
printf ( "Insertion Sort\n" ) ;
NextInsertionSort ( b, pos, n) ;
} else {
printf ( "Merge Sort\n" ) ;
int len= 2 * GetMergeLen ( b, n) ;
NextMergeSort ( b, 0 , n- 1 , len) ;
}
for ( i= 0 ; i< n; i++ ) {
if ( i)
printf ( " " ) ;
printf ( "%d" , b[ i] ) ;
}
return 0 ;
}