record
思路大概就是如果值域不相交就交换,否则直接处理
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define M long long
namespace FastIO {
char buf[1 << 21], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p1 = buf, p2 = (p1 + fread(buf, 1, 1 << 21, stdin))) == p1 ? EOF : *p1++)
template <typename T> inline T read() { T x = 0, w = 0; char ch = getchar(); while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar(); while ('0' <= ch && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar(); return w ? -x : x; }
template <typename T> inline void write(T x) { if (!x) return; write<T>(x / 10), putchar((x % 10) ^ '0'); }
template <typename T> inline void print(T x) { if (x > 0) write<T>(x); else if (x < 0) putchar('-'), write<T>(-x); else putchar('0'); }
template <typename T> inline void print(T x, char en) { print<T>(x), putchar(en); }
}; using namespace FastIO;
#undef getchar()
using namespace std;
int n,m,q;
int a[21][2000005];
int r[21];
bool flag[30];
void sortt(int aa,int bb){
int i=r[aa],j=r[bb];
if(!flag[i]){
std::sort(a[i]+1,a[i]+1+n);
flag[i]=1;
}
if(!flag[j]){
std::sort(a[j]+1,a[j]+1+n);
flag[j]=1;
}
if(a[i][n]<a[j][1])return;
if(a[i][1]>a[j][n]){
swap(r[aa],r[bb]);
return;
}
int c[2*n+10];
int cnt=1,h=1,k=1;
while(cnt<=2*n){
if(h==n+1){
c[cnt++]=a[j][k++];
}
else if(k==n+1){
c[cnt++]=a[i][h++];
}
else if(a[i][h]<=a[j][k]){
c[cnt++]=a[i][h++];
}
else{
c[cnt++]=a[j][k++];
}
}
for(int i1=1;i1<=n;i1++)a[i][i1]=c[i1];
for(int i1=1;i1<=n;i1++)a[j][i1]=c[i1+n];
}
int main(){
for(int i=1;i<=20;i++)r[i]=i;
n=read<int>(),m=read<int>(),q=read<int>();
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
a[i][j]=read<int>();
}
}
for(int i=1;i<=q;i++){
int ord,i1,j1;
ord=read<int>(),i1=read<int>(),j1=read<int>();
if(ord==1){
sortt(i1,j1);
}
else{
print<int>(a[r[i1]][j1],'\n');
}
}
return 0;
}