#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

// ovo nije bilo lako otkucati.

const int N = 1010;
const int INF = 1 << 30;
int a[N][N];
int n;

struct cell { int h, j, min, max; } ; // min - min j za sve pre (i nju), max - slicno
cell b[N][N];
bool operator<(cell a, cell b) { return a.h < b.h; }

void update_m(cell b[], int a[])
{
    b[0].max = b[0].min = b[0].j;
    for(int i = 1; i < n; i++)
    {
        b[i].max = max(b[i].j, b[i - 1].max);
        b[i].min = min(b[i].j, b[i - 1].min);
    }
}

void update(int x, int y, int h)
{
    a[x][y] = h;
    int i;
    for(i = 0; b[x][i].j != y; i++) ;
    y = i;
    b[x][y].h = h;
    while(y < n - 1 && b[x][y].h > b[x][y + 1].h) { swap(b[x][y], b[x][y + 1]); y++; }
    while(y > 0 && b[x][y].h < b[x][y - 1].h) { swap(b[x][y], b[x][y - 1]); y--; }
    update_m(b[x],a[x]);
}

int abs(int x) { return x < 0 ? -x : x; }

int query(int x, int y)
{
    int res = -1;
    for(int i = 0; i < n; i++)
    {
        if(b[i][0].h >= a[x][y]) continue;

        int l = 0, r = n - 1;
        while(l < r)
        {
            int s = (l + r) / 2;
            if(b[i][s].h >= a[x][y]) r = s;
            else l = s + 1;
        }
        if(b[i][l].h >= a[x][y]) l--;
        res = max(res, abs(x - i) + max(abs(y - b[i][l].min), abs(y - b[i][l].max)));
    }
    return res;
}

int main()
{
    freopen("pentranje.in","r",stdin);
    freopen("pentranje.out","w",stdout);

    scanf("%i",&n);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            scanf("%i",&a[i][j]);

    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
        {
            b[i][j].h = a[i][j];
            b[i][j].j = j;
        }
    for(int i = 0; i < n; i++) sort(b[i], b[i] + n);
    for(int i = 0; i < n; i++) update_m(b[i],a[i]);

    int q;
    scanf("%i",&q);
    for(int i = 0; i < q; i++)
    {
        int comm, x, y;
        scanf("%i",&comm);
        if(comm == 1)
        {
            scanf("%i %i",&x,&y);
            x--; y--;
            printf("%i\n",query(x,y));
        }
        else
        {
            int h;
            scanf("%i %i %i",&x,&y,&h);
            x--; y--;
            update(x,y,h);
        }
    }

    return 0;
}

/*
  Ako gazda Srbi treba ~1 min da se popne na drvo ili posece / nakalemi drvo, i ako se sve
  ovo radi bez pauze, za najveci primer bi mu trebalo ~11 meseci. Pa sad vi vidite da li su
  ova ogranicenja normalna.
    -- takmicar
*/