#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int a[64][64];
int tile=1;
void chessboard(int tr,int tc,int dr,int dc,int size)
//tr,tc起始位置 dr,dc特殊方格位置 size块大小
{
if(size==1)
return ;
int t=tile++;//L型骨牌号
int s=size/2;//分割棋盘
//覆盖左上角子棋盘
if(dr<tr+s && dc<tc+s)
//特殊方格在此棋盘中
chessboard(tr,tc,dr,dc,s);
else{
//特殊方格不在此棋盘中
//用t号L型骨牌覆盖右下角
a[tr+s-1][tc+s-1]=t;
//覆盖其余方格
chessboard(tr,tc,tr+s-1,tc+s-1,s);
}
//覆盖右上角子棋盘
if(dr<tr+s && dc>=tc+s)
//特殊方格在此棋盘中
chessboard(tr,tc+s,dr,dc,s);
else{
//特殊方格不在此棋盘中
//用t号L型骨牌覆盖左下角
a[tr+s-1][tc+s]=t;
//覆盖其余方格
chessboard(tr,tc+s,tr+s-1,tc+s,s);
}
//覆盖左下角子棋盘
if(dr>=tr+s && dc<tc+s)
//特殊方格在此棋盘中
chessboard(tr+s,tc,dr,dc,s);
else{
//特殊方格不在此棋盘中
//用t号L型骨牌覆盖右上角
a[tr+s][tc+s-1]=t;
//覆盖其余方格
chessboard(tr+s,tc,tr+s,tc+s-1,s);
}
//覆盖右下角子棋盘
if(dr>=tr+s && dc>=tc+s)
//特殊方格在此棋盘中
chessboard(tr+s,tc+s,dr,dc,s);
else{
//特殊方格不在此棋盘中
//用t号L型骨牌覆盖左上角
a[tr+s][tc+s]=t;
//覆盖其余方格
chessboard(tr+s,tc+s,tr+s,tc+s,s);
}
}
void print(int tr,int tc,int dr,int dc,int size){
int i,j;
chessboard(tr,tc,dr,dc,size);
for(i=0;i<size;i++){
for(j=0;j<size;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int k;
int tr;
int tc;
int size;
while(cin>>k>>tr>>tc){
size=(int)(pow(2.0,k*1.0));
print(0,0,tr,tc,size);
}
return 0;
}