#include <bits/stdc++.h>
using namespace std;
using vint = vector<int>;
using ll = long long;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using pill = pair<int, ll>;
using vpill = vector<pill>;
using plli = pair<ll, int>;
using vplli = vector<plli>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for(int i = (n)-1; i >= 0; --i)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a)-1; i >= (b); --i)
const int WIN_SIZE = 100;
const int ARR_SIZE = 40;
struct DSU {
vint p, size; int groups;
DSU(int n): p(n), size(n, 1), groups(n) {
iota(all(p), 0);
}
int find(int v) {
if (p[v] == v) return v;
return p[v] = find(p[v]);
}
void unite(int u, int v) {
u = find(u), v = find(v);
if (u == v) return;
if (size[u] < size[v]) swap(u, v);
p[v] = u; size[u] += size[v]; groups--;
}
};
string process(vector<vector<string>> a, int i, int j, int k, int n) {
int m = 2*(n-k-1);
if (k == n-1) {
int box_size = 2*n+1;
string res(WIN_SIZE, '0');
rep(y, 3) rep(x, 3) {
if (x == 2 && y == 2) {
int sm_box_size = box_size-2;
rep(y2, sm_box_size) rep(x2, sm_box_size) {
res[(x+x2) + box_size*(y+y2)] = a[y][x][x2 + sm_box_size*y2];
}
}
else if (x == 2) {
int sm_line_size = box_size-2;
rep(x2, sm_line_size) res[(x+x2) + box_size*y] = a[y][x][x2];
}
else if (y == 2) {
int sm_line_size = box_size-2;
rep(y2, sm_line_size) res[x + box_size*(y+y2)] = a[y][x][y2];
}
else {
res[x + box_size*y] = a[y][x][0];
}
}
DSU g_counter(box_size*box_size);
int w_counter = 0;
rep(x, box_size) rep(y, box_size) {
int value = res[x + y*box_size] - '0';
if (value) {
if (x != 0) {
int px_val = res[x-1 + y*box_size] - '0';
if (px_val) g_counter.unite(x+y*box_size, (x-1) + y*box_size);
}
if (y != 0) {
int py_val = res[x + (y-1)*box_size] - '0';
if (py_val) g_counter.unite(x+y*box_size, x + (y-1)*box_size);
}
} else w_counter++;
}
int val = g_counter.groups - w_counter;
string sval = bitset<100>(val).to_string();
reverse(all(sval));
return sval;
} else {
if (j == m && i == m) {
int box_size = 2*n+1-m;
string res(WIN_SIZE, '0');
rep(y, 3) rep(x, 3) {
if (x == 2 && y == 2) {
int sm_box_size = box_size-2;
rep(y2, sm_box_size) rep(x2, sm_box_size) {
res[(x+x2) + box_size*(y+y2)] = a[y][x][x2 + sm_box_size*y2];
}
}
else if (x == 2) {
int sm_line_size = box_size-2;
rep(x2, sm_line_size) res[(x+x2) + box_size*y] = a[y][x][x2];
}
else if (y == 2) {
int sm_line_size = box_size-2;
rep(y2, sm_line_size) res[x + box_size*(y+y2)] = a[y][x][y2];
}
else {
res[x + box_size*y] = a[y][x][0];
}
}
return res;
}
else if (j == m) {
int line_size = 2*n-m+1;
string res(WIN_SIZE, '0');
res[0] = a[0][0][0]; res[1] = a[0][1][0];
int sm_line_size = line_size-2;
rep(x, sm_line_size) res[2+x] = a[0][2][x];
return res;
}
else if (i == m) {
int line_size = 2*n-m+1;
string res(WIN_SIZE, '0');
res[0] = a[0][0][0]; res[1] = a[1][0][0];
int sm_line_size = line_size-2;
rep(y, sm_line_size) res[2+y] = a[2][0][y];
return res;
}
else {
return a[0][0];
}
}
}