#include <iostream>
using namespace std;

void create(int** x, int k)
{
  if (k == 1)
  {
    x[0][0] = 1;
    x[0][1] = 2;
    x[1][0] = 3;
    x[1][1] = 1;
  }
  else 
  {
    create(x, k - 1);
    int from = 1 << (k - 1), n = 1 << k;
    for (int i = from; i < n; i++)
      for (int j = from; j < n; j++)
        x[i][j] = x[i - from][j - from];
    for (int i = 0; i < from; i++)
      for (int j = 0; j < from; j++)
      {
        x[i + from][j] = x[i][j] + n;
        x[i][j + from] = x[i][j] + n;
      }
    for (int i = 0; i < from; i++)
      x[i + from][i]--;
  }
}

int main() 
{
  int k, n = 1;
  scanf("%d", &k);
  n <<= k;
  int** x = new int*[n];
  for (int i = 0; i < n; i++)
    x[i] = new int[n];
  create(x, k);
  for (int i = 0; i < n; i++)
  {
    printf("%d", x[i][0]);
    for (int j = 1; j < n; j++)
      printf(" %d", x[i][j]);
    printf("\n");
  }
  return 0;
}