#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int n,m,q,a[N],aa[2*N],id[25];
bool b[25];
char buf[1<<20],*p1,*p2;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin), p1 == p2) ? 0 : *p1++)
int read(){
int x=0,f=1;
char c;
c=getchar();
if(c=='-')f=-1,c=getchar();
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
signed main(){
n=read();
m=read();
q=read();
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
a[(i-1)*n+j]=read();
}
id[i]=i;
}
int opt,x,y;
for(int i=1;i<=q;++i){
opt=read();
x=read();
y=read();
if(opt==2){
printf("%d\n",a[(id[x]-1)*n+y]);
}
else{
if(b[id[x]]&&b[id[y]]){
if(a[id[x]*n]<=a[(id[y]-1)*n+1])continue;
if(a[(id[x]-1)*n+1]>=a[id[y]*n]){
swap(id[x],id[y]);
continue;
}
}
for(int j=1;j<=n;++j){
aa[j]=a[(id[x]-1)*n+j];
aa[j+n]=a[(id[y]-1)*n+j];
}
sort(aa+1,aa+1+2*n);
for(int j=1;j<=n;++j){
a[(id[x]-1)*n+j]=aa[j];
a[(id[y]-1)*n+j]=aa[j+n];
}
b[id[x]]=b[id[y]]=1;
}
}
return 0;
}