#include <bits/stdc++.h>
using namespace std;
#define all(ac) ac.begin(),ac.end()
#define task "tet"
#define fi first
#define se second
#define pii pair<int,int>
#define db long double
#define int long long
#define pb push_back
#define eb emplace_back
const int N = 505;
int n, m, a[N][N], q;
int MOD;
struct node {
int mx, mn;
node(int mx = -1e18, int mn = 1e18): mx(mx), mn(mn) {}
};
struct segtree {
int n;
vector <node> tree;
segtree(int n): n(n), tree(n << 2 | 1, node()) {}
node Merge(node a, node b) {
node res;
res.mx = max(a.mx, b.mx);
res.mn = min(a.mn, b.mn);
return res;
}
void update(int id, int l, int r, int pos, int w) {
if(l > pos || r < pos) return;
if(l == r) {
if(w == -1) tree[id] = node();
else {
tree[id].mx = w;
tree[id].mn = w;
}
return;
}
int mid = (l + r) >> 1;
update(id << 1, l, mid, pos, w);
update(id << 1 | 1, mid + 1, r, pos, w);
tree[id] = Merge(tree[id << 1], tree[id << 1 | 1]);
return;
}
int get(int id, int l, int r, int u, int v, int x, int y) {
if(l > v || r < u || tree[id].mn >= x && tree[id].mx <= y) return MOD;
if(l == r) return l;
int mid = (l + r) >> 1;
if(l >= u && r <= v) {
node val_left = tree[id << 1];
if(val_left.mx > y || val_left.mn < x)
return get(id << 1, l, mid, u, v, x, y);
return get(id << 1 | 1, mid + 1, r, u, v, x, y);
}
return min(get(id << 1 | 1, mid + 1, r, u, v, x, y), get(id << 1, l, mid, u, v, x, y));
}
void update(int pos, int w) {
return update(1, 0, n - 1, pos, w), void();
}
int get(int l, int r, int x, int y) {
return get(1, 0, n - 1, l, r, x, y);
}
};
int32_t main() {
if(fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
MOD = n * m;
segtree Col(MOD), Row(MOD);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin >> a[i][j];
Row.update(a[i][j], i);
Col.update(a[i][j], j);
}
}
cin >> q;
int w = 0;
while(q--) {
int type; cin >> type;
if(type == 1) {
int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2;
Row.update(a[r1][c1], r2);
Row.update(a[r2][c2], r1);
Col.update(a[r1][c1], c2);
Col.update(a[r2][c2], c1);
swap(a[r1][c1], a[r2][c2]);
}
else
if(type == 2) {
int ww; cin >> ww;
w = (w + ww) % MOD;
}
else {
int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2;
if(r1 == 1 && c1 == 1 && r2 == n && c2 == m) {
cout << "-1\n";
continue;
}
int ans = min(Col.get(MOD - w, MOD - 1, c1, c2), Row.get(MOD - w, MOD - 1, r1, r2));
if(ans != MOD) {
cout << ans - MOD + w << '\n';
continue;
}
cout << min(Row.get(0, MOD - w - 1, r1, r2), Col.get(0, MOD - w - 1, c1, c2)) + w << '\n';
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgYWxsKGFjKSBhYy5iZWdpbigpLGFjLmVuZCgpCiNkZWZpbmUgdGFzayAidGV0IgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBkYiBsb25nIGRvdWJsZQojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKCmNvbnN0IGludCBOID0gNTA1OwppbnQgbiwgbSwgYVtOXVtOXSwgcTsKaW50IE1PRDsKCnN0cnVjdCBub2RlIHsKICAgIGludCBteCwgbW47CiAgICBub2RlKGludCBteCA9IC0xZTE4LCBpbnQgbW4gPSAxZTE4KTogbXgobXgpLCBtbihtbikge30KfTsKCnN0cnVjdCBzZWd0cmVlIHsKICAgIGludCBuOwogICAgdmVjdG9yIDxub2RlPiB0cmVlOwoKICAgIHNlZ3RyZWUoaW50IG4pOiBuKG4pLCB0cmVlKG4gPDwgMiB8IDEsIG5vZGUoKSkge30KCiAgICBub2RlIE1lcmdlKG5vZGUgYSwgbm9kZSBiKSB7CiAgICAgICAgbm9kZSByZXM7CiAgICAgICAgcmVzLm14ID0gbWF4KGEubXgsIGIubXgpOwogICAgICAgIHJlcy5tbiA9IG1pbihhLm1uLCBiLm1uKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBpbnQgdykgewogICAgICAgIGlmKGwgPiBwb3MgfHwgciA8IHBvcykgcmV0dXJuOwogICAgICAgIGlmKGwgPT0gcikgewogICAgICAgICAgICBpZih3ID09IC0xKSB0cmVlW2lkXSA9IG5vZGUoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0cmVlW2lkXS5teCA9IHc7CiAgICAgICAgICAgICAgICB0cmVlW2lkXS5tbiA9IHc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICB1cGRhdGUoaWQgPDwgMSwgbCwgbWlkLCBwb3MsIHcpOwogICAgICAgIHVwZGF0ZShpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgcG9zLCB3KTsKICAgICAgICB0cmVlW2lkXSA9IE1lcmdlKHRyZWVbaWQgPDwgMV0sIHRyZWVbaWQgPDwgMSB8IDFdKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgeCwgaW50IHkpIHsKICAgICAgICBpZihsID4gdiB8fCByIDwgdSB8fCB0cmVlW2lkXS5tbiA+PSB4ICYmIHRyZWVbaWRdLm14IDw9IHkpIHJldHVybiBNT0Q7CiAgICAgICAgaWYobCA9PSByKSByZXR1cm4gbDsKICAgICAgICAKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIGlmKGwgPj0gdSAmJiByIDw9IHYpIHsKICAgICAgICAgICAgbm9kZSB2YWxfbGVmdCA9IHRyZWVbaWQgPDwgMV07CiAgICAgICAgICAgIGlmKHZhbF9sZWZ0Lm14ID4geSB8fCB2YWxfbGVmdC5tbiA8IHgpCiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGlkIDw8IDEsIGwsIG1pZCwgdSwgdiwgeCwgeSk7CiAgICAgICAgICAgIHJldHVybiBnZXQoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYsIHgsIHkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWluKGdldChpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdiwgeCwgeSksIGdldChpZCA8PCAxLCBsLCBtaWQsIHUsIHYsIHgsIHkpKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgcG9zLCBpbnQgdykgewogICAgICAgIHJldHVybiB1cGRhdGUoMSwgMCwgbiAtIDEsIHBvcywgdyksIHZvaWQoKTsKICAgIH0KCiAgICBpbnQgZ2V0KGludCBsLCBpbnQgciwgaW50IHgsIGludCB5KSB7CiAgICAgICAgcmV0dXJuIGdldCgxLCAwLCBuIC0gMSwgbCwgciwgeCwgeSk7CiAgICB9Cn07CgppbnQzMl90IG1haW4oKSB7CiAgICBpZihmb3Blbih0YXNrIi5pbnAiLCAiciIpKSB7CiAgICAgICAgZnJlb3Blbih0YXNrIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKHRhc2siLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApLCBjb3V0LnRpZSgwKTsKCiAgICBjaW4gPj4gbiA+PiBtOwogICAgTU9EID0gbiAqIG07CiAgICBzZWd0cmVlIENvbChNT0QpLCBSb3coTU9EKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKSB7CiAgICAgICAgZm9yKGludCBqPTE7ajw9bTtqKyspIHsKICAgICAgICAgICAgY2luID4+IGFbaV1bal07CiAgICAgICAgICAgIFJvdy51cGRhdGUoYVtpXVtqXSwgaSk7CiAgICAgICAgICAgIENvbC51cGRhdGUoYVtpXVtqXSwgaik7CiAgICAgICAgfQogICAgfQoKICAgIGNpbiA+PiBxOwogICAgaW50IHcgPSAwOwogICAgd2hpbGUocS0tKSB7CiAgICAgICAgaW50IHR5cGU7IGNpbiA+PiB0eXBlOwogICAgICAgIGlmKHR5cGUgPT0gMSkgewogICAgICAgICAgICBpbnQgcjEsIGMxLCByMiwgYzI7IGNpbiA+PiByMSA+PiBjMSA+PiByMiA+PiBjMjsKICAgICAgICAgICAgUm93LnVwZGF0ZShhW3IxXVtjMV0sIHIyKTsKICAgICAgICAgICAgUm93LnVwZGF0ZShhW3IyXVtjMl0sIHIxKTsKICAgICAgICAgICAgQ29sLnVwZGF0ZShhW3IxXVtjMV0sIGMyKTsKICAgICAgICAgICAgQ29sLnVwZGF0ZShhW3IyXVtjMl0sIGMxKTsKICAgICAgICAgICAgc3dhcChhW3IxXVtjMV0sIGFbcjJdW2MyXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICBpZih0eXBlID09IDIpIHsKICAgICAgICAgICAgaW50IHd3OyBjaW4gPj4gd3c7CiAgICAgICAgICAgIHcgPSAodyArIHd3KSAlIE1PRDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGludCByMSwgYzEsIHIyLCBjMjsgY2luID4+IHIxID4+IGMxID4+IHIyID4+IGMyOwogICAgICAgICAgICBpZihyMSA9PSAxICYmIGMxID09IDEgJiYgcjIgPT0gbiAmJiBjMiA9PSBtKSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICItMVxuIjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgYW5zID0gbWluKENvbC5nZXQoTU9EIC0gdywgTU9EIC0gMSwgYzEsIGMyKSwgUm93LmdldChNT0QgLSB3LCBNT0QgLSAxLCByMSwgcjIpKTsKICAgICAgICAgICAgaWYoYW5zICE9IE1PRCkgewogICAgICAgICAgICAgICAgY291dCA8PCBhbnMgLSBNT0QgKyB3IDw8ICdcbic7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8IG1pbihSb3cuZ2V0KDAsIE1PRCAtIHcgLSAxLCByMSwgcjIpLCBDb2wuZ2V0KDAsIE1PRCAtIHcgLSAxLCBjMSwgYzIpKSArIHcgPDwgJ1xuJzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQ==