#include <bits/stdc++.h>
const int oo = 2139063143;
const int N = 101000, K = 13;
const int P = 1000000007;
using namespace std;
template <typename T>
inline void sc(T &x) {
  x = 0;
  static int p;
  p = 1;
  static char c;
  c = getchar();
  while (!isdigit(c)) {
    if (c == '-') p = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c - 48);
    c = getchar();
  }
  x *= p;
}
template <typename T>
inline void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
inline void pr(T x) {
  print(x), putchar('\n');
}
int a[K][N];
int n, k, q;
struct LY {
  int x, y, op;
} b[N];
int dfs(int x, int y) {
  if (x <= k) return a[x][y];
  int g1 = dfs(b[x].x, y), g2 = dfs(b[x].y, y);
  return b[x].op ? min(g1, g2) : max(g1, g2);
}
int main() {
  sc(n), sc(k), sc(q);
  for (int i = 1; i <= k; i++)
    for (int j = 1; j <= n; j++) sc(a[i][j]);
  int m = k;
  while (q--) {
    int op, x, y;
    sc(op), sc(x), sc(y);
    if (op <= 2)
      b[++m] = (LY){x, y, op - 1};
    else
      pr(dfs(x, y));
  }
  return 0;
}
