#include <iostream>
using namespace std;
void create(int** x, int pow)
{
if (pow == 1)
{
x[0][0] = 1;
x[0][1] = 2;
x[1][0] = 3;
x[1][1] = 1;
}
else
{
create(x, pow - 1);
int from = 1 << (pow - 1), n = 1 << pow;
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()
{
ios::sync_with_stdio(false);
int pow, n = 1;
scanf("%d", &pow);
n <<= pow;
int** x = new int*[n];
for (int i = 0; i < n; i++)
x[i] = new int[n];
create(x, pow);
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBjcmVhdGUoaW50KiogeCwgaW50IHBvdykKewogIGlmIChwb3cgPT0gMSkKICB7CiAgICB4WzBdWzBdID0gMTsKICAgIHhbMF1bMV0gPSAyOwogICAgeFsxXVswXSA9IDM7CiAgICB4WzFdWzFdID0gMTsKICB9CiAgZWxzZSAKICB7CiAgICBjcmVhdGUoeCwgcG93IC0gMSk7CiAgICBpbnQgZnJvbSA9IDEgPDwgKHBvdyAtIDEpLCBuID0gMSA8PCBwb3c7CiAgICBmb3IgKGludCBpID0gZnJvbTsgaSA8IG47IGkrKykKICAgICAgZm9yIChpbnQgaiA9IGZyb207IGogPCBuOyBqKyspCiAgICAgICAgeFtpXVtqXSA9IHhbaSAtIGZyb21dW2ogLSBmcm9tXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJvbTsgaSsrKQogICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyb207IGorKykKICAgICAgewogICAgICAgIHhbaSArIGZyb21dW2pdID0geFtpXVtqXSArIG47CiAgICAgICAgeFtpXVtqICsgZnJvbV0gPSB4W2ldW2pdICsgbjsKICAgICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tOyBpKyspCiAgICAgIHhbaSArIGZyb21dW2ldLS07CiAgfQp9CgppbnQgbWFpbigpIAp7CiAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogIGludCBwb3csIG4gPSAxOwogIHNjYW5mKCIlZCIsICZwb3cpOwogIG4gPDw9IHBvdzsKICBpbnQqKiB4ID0gbmV3IGludCpbbl07CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB4W2ldID0gbmV3IGludFtuXTsKICBjcmVhdGUoeCwgcG93KTsKICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICB7CiAgICBwcmludGYoIiVkIiwgeFtpXVswXSk7CiAgICBmb3IgKGludCBqID0gMTsgaiA8IG47IGorKykKICAgICAgcHJpbnRmKCIgJWQiLCB4W2ldW2pdKTsKICAgIHByaW50ZigiXG4iKTsKICB9CiAgcmV0dXJuIDA7Cn0=