思维题(看了题解后自己又画了半天才搞懂…)
题意:给出
k
(
思路:每次产生的新生物的特性都是基于初始的
k
个生物,因此后续产生的每个生物都可以用前
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;
const int maxn = 100050;
int a[15][maxn], rk[maxn][15];
bitset<4096> bt[maxn];
int cmp_id;
bool cmp(const int x, const int y) {
return a[x][cmp_id] < a[y][cmp_id];
}
int main() {
int n, k, q;
while(scanf("%d%d%d",&n,&k,&q) == 3) {
for(int i=1; i<=k; i++)
for(int j=1; j<=n; j++) {
scanf("%d",&a[i][j]);
rk[j][i] = i;
}
for(int j=1; j<=n; j++) {
cmp_id = j;
sort(rk[j]+1, rk[j]+k+1, cmp);
}
for(int i=1; i<=k; i++)
for(int j=0; j<(1<<k); j++) {
if(j&(1<<(i-1))) bt[i][j] = 1;
else bt[i][j] = 0;
}
int tot = k;
while(q --) {
int op, x, y;
scanf("%d%d%d",&op,&x,&y);
if(op == 1)
bt[++tot] = bt[x] | bt[y];
else if(op == 2)
bt[++tot] = bt[x] & bt[y];
else {
int id = k+1, cur = 0;
while(bt[x][cur] == 0) {
id --;
cur |= 1<<(rk[y][id]-1);
}
printf("%d\n",a[rk[y][id]][y]);
}
/*printf("tot:%d\n",tot);
for(int j=0; j<(1<<k); j++)
printf("%d ",(int)bt[tot][j]);
puts("");*/
}
}
return 0;
}