#include <bits/stdc++.h>
using namespace std;
int n, k, q, a[12][100010];
bitset<4096> bt[150010];
int main() {
  scanf("%d%d%d", &n, &k, &q);
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < n; j++) scanf("%d", &a[i][j]);
  }
  for (int i = 0; i < k; i++) {
    for (int j = 1; j < (1 << k); j++) {
      if ((j >> i) & 1) bt[i].set(j);
    }
  }
  int tcnt = k;
  for (int i = 0, opt, x, y; i < q; i++) {
    scanf("%d", &opt);
    if (opt == 1)
      scanf("%d%d", &x, &y), x--, y--, bt[tcnt++] = bt[x] | bt[y];
    else if (opt == 2)
      scanf("%d%d", &x, &y), x--, y--, bt[tcnt++] = bt[x] & bt[y];
    else {
      scanf("%d%d", &x, &y);
      x--;
      y--;
      int ans = 0;
      for (int j = 0; j < k; j++) {
        int cur = 0;
        for (int l = 0; l < k; l++) {
          if (a[l][y] >= a[j][y]) cur |= (1 << l);
        }
        if (bt[x][cur]) ans = max(ans, a[j][y]);
      }
      printf("%d\n", ans);
    }
  }
  return 0;
}
