题解:P11244 吻秋
这道题如果就按照题目描述所说的办法做,就是一个
那么正解事实上是从性质
记
只有当
总时间复杂度
代码:
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
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;
int a[21][2000001],aa[4000001],a2[21][2000001];
bool b[21],bb[21][21];
int p[21];
int main(){
int n=read<int>(),m=read<int>(),q=read<int>();
for(int i=1;i<=m;i++){p[i]=i;
for(int j=1;j<=n;j++)a[i][j]=read<int>(),aa[j]=a[i][j];
std::sort(aa+1,aa+n+1);
for(int j=1;j<=n;j++)a2[i][j]=aa[j];
}
while(q--){
int op=read<int>(),x=read<int>(),y=read<int>();
if(op==1){
int xx=x,yy=y;
x=p[x],y=p[y];
if(bb[x][y])continue;
if(bb[y][x]){
std::swap(p[xx],p[yy]);
continue;
}
b[x]=b[y]=1;
int cnt=1,i=1,j=1;
while(i<=n&&j<=n){
if(a2[x][i]<a2[y][j])aa[cnt++]=a2[x][i++];
else aa[cnt++]=a2[y][j++];
}
while(i<=n)aa[cnt++]=a2[x][i++];
while(j<=n)aa[cnt++]=a2[y][j++];
for(i=1;i<=n;i++)a2[x][i]=aa[i],a2[y][i]=aa[i+n];
for(i=1;i<=m;i++)if(i!=x&&i!=y)bb[i][y]|=bb[i][x],bb[x][i]|=bb[y][i],bb[i][x]=0,bb[y][i]=0;
bb[x][y]=1;
}
else print((b[x]?(a2[p[x]][y]):(a[p[x]][y])),'\n');
}
}