//Bài 4
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

int m, n, Q;
vector<vector<int>> a;

struct SquareInfo {
    int rows;
    int cols;
    vector<int> diff;
    multiset<int> allDiff;
};

SquareInfo sq[5];

int getId(int k, int r, int c) {
    return (r - 1) * sq[k].cols + (c - 1);
}

int calcDiff(int k, int r, int c) {
    int mn = INF;
    int mx = -INF;

    for (int i = r; i < r + k; i++) {
        for (int j = c; j < c + k; j++) {
            mn = min(mn, a[i][j]);
            mx = max(mx, a[i][j]);
        }
    }

    return mx - mn;
}

void build() {
    int limit = min(m, n);

    for (int k = 1; k <= limit; k++) {
        sq[k].rows = m - k + 1;
        sq[k].cols = n - k + 1;

        int total = sq[k].rows * sq[k].cols;
        sq[k].diff.assign(total, 0);
        sq[k].allDiff.clear();

        for (int r = 1; r <= sq[k].rows; r++) {
            for (int c = 1; c <= sq[k].cols; c++) {
                int val = calcDiff(k, r, c);
                int id = getId(k, r, c);

                sq[k].diff[id] = val;
                sq[k].allDiff.insert(val);
            }
        }
    }
}

void removeSquare(int k, int r, int c) {
    int id = getId(k, r, c);
    int oldVal = sq[k].diff[id];

    auto it = sq[k].allDiff.find(oldVal);
    if (it != sq[k].allDiff.end()) {
        sq[k].allDiff.erase(it);
    }
}

void addSquare(int k, int r, int c) {
    int id = getId(k, r, c);
    int newVal = calcDiff(k, r, c);

    sq[k].diff[id] = newVal;
    sq[k].allDiff.insert(newVal);
}

void updateCell(int x, int y, int val) {
    int limit = min(m, n);

    for (int k = 1; k <= limit; k++) {
        int r1 = max(1, x - k + 1);
        int r2 = min(x, m - k + 1);

        int c1 = max(1, y - k + 1);
        int c2 = min(y, n - k + 1);

        for (int r = r1; r <= r2; r++) {
            for (int c = c1; c <= c2; c++) {
                removeSquare(k, r, c);
            }
        }
    }

    a[x][y] = val;

    for (int k = 1; k <= limit; k++) {
        int r1 = max(1, x - k + 1);
        int r2 = min(x, m - k + 1);

        int c1 = max(1, y - k + 1);
        int c2 = min(y, n - k + 1);

        for (int r = r1; r <= r2; r++) {
            for (int c = c1; c <= c2; c++) {
                addSquare(k, r, c);
            }
        }
    }
}

int query(int T) {
    int limit = min(m, n);
    int ans = 0;

    for (int k = 1; k <= limit; k++) {
        if (!sq[k].allDiff.empty()) {
            int best = *sq[k].allDiff.begin();

            if (best <= T) {
                ans = k;
            }
        }
    }

    return ans;
}

int main() {
 
    freopen("khuvuonanhsang.inp","r",stdin);
    freopen("khuvuonanhsang.out","w",stdout);
    cin >> m >> n >> Q;

    a.assign(m + 1, vector<int>(n + 1));

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> a[i][j];
        }
    }

    build();

    while (Q--) {
        int type;
        cin >> type;

        if (type == 1) {
            int i, j, X;
            cin >> i >> j >> X;

            updateCell(i, j, X);
        } else {
            int T;
            cin >> T;

            cout << query(T) << '\n';
        }
    }

    return 0;
}
