import java.util.*;
public class Main{
static int[][] plan;//从下标1开始
static void Plan(int k){
int size=2;//初始日程表是2×2的方阵
plan[1][1]=1;plan[1][2]=2;
plan[2][1]=2;plan[2][2]=1;
for(int k0=1;k0<k;k0++){//迭代,依次处理2^2(k0=1)、...、2^k(k0=k-1)选手。用k来控制迭代次数
int size0=size;//原始方阵的边界
size=size*2;//扩充后方阵的边界
for(int i=size0+1;i<=size;i++)//填左下角元素
for(int j=1;j<=size0;j++)
plan[i][j]=plan[i-size0][j]+size0;
for(int i=1;i<=size0;i++)//填右上角元素
for(int j=size0+1;j<=size;j++)
plan[i][j]=plan[i+size0][j-size0];
for(int i=size0+1;i<=size;i++)//填右下角元素
for(int j=size0+1;j<=size;j++)
plan[i][j]=plan[i-size0][j-size0];
}
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int k=in.nextInt();
int size=(int) Math.pow(2,k);
plan=new int[size+1][size+1];
Plan(k);
for(int i=1;i<=size;i++){
for(int j=1;j<=size;j++){
System.out.print(plan[i][j]+" ");
}
System.out.println();
}
}
}