比赛 期末考试2 评测结果 AAAAAAAWAA
题目名称 魔法 最终得分 90
用户昵称 xuyuqing 运行时间 0.783 s
代码语言 C++ 内存使用 58.63 MiB
提交时间 2026-02-10 10:33:43
显示代码纯文本

#include <algorithm>
#include <bitset>
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

class fastIn {
	private:
	
	char buf [1 << 20];
	char *p1 = buf;
	char *p2 = buf;
	
	inline char getch ();
	
	public:
	
	template <typename NumT>
	void read (NumT &num);
	
	template <typename NumT>
	fastIn& operator >> (NumT &num);
};

inline char fastIn::getch () {
	if (p1 == p2) {
		p1 = buf;
		p2 = buf + fread (buf, 1, 1 << 20, stdin);
		if (p1 == p2) {
			return EOF;
		}
	}
	return *p1++;
}

template <typename NumT>
void fastIn::read (NumT &num) {
	char ch = getch ();
	NumT op = 1;
	num = 0;
	
	while (ch < '0' || '9' < ch) {
		op = ((ch == '-') ? -1 : 1);
		ch = getch ();
	}
	while ('0' <= ch && ch <= '9') {
		num *= 10;
		num += (ch - '0');
		ch = getch ();
	}
	
	num *= op;
}

template <typename NumT>
fastIn& fastIn::operator >> (NumT &num) {
	read (num);
	return *this;
}

fastIn fin;

constexpr int N = 114514;
constexpr int K = 13;

int n;
int k;
int q;
int a[K][N];
pair<int, int> magic[N][K];
int now;
bitset<(1 << K)> b[N];
int cc;

int main () {

	freopen ("breeding.in", "r", stdin);
	freopen ("breeding.out", "w", stdout);

	fin >> n >> k >> q;
	for (int i = 1; i <= k; i++) {
		for (int j = 1; j <= n; j++) {
			fin >> a[i][j];
			magic[j][i] = make_pair (a[i][j], i);
		}
	}

	for (int i = 1; i <= n; i++) {
		sort (magic[i] + 1, magic[i] + 1 + k);
		reverse (magic[i] + 1, magic[i] + 1 + k);
	}

	for (int i = 1; i <= k; i++) {
		for (int j = 0; j < (1 << k); j++) {
			if (j & (1 << (i - 1))) {
				b[i][j] = 1;
			}
		}
	}

	cc = k;
	for (int i = 1; i <= q; i++) {
		int opt, x, y;
		fin >> opt >> x >> y;

		if (opt == 1) {
			cc++;
			b[cc] = b[x] | b[y];
		}
		else if (opt == 2) {
			cc++;
			b[cc] = b[x] & b[y];
		}
		else {
			int t = 0;
			for (int i = 1; i <= k; i++) {
				t |= (1 << (magic[y][i].second - 1));
				if (b[x][t]) {
					printf ("%d\n", a[magic[y][i].second][y]);
					break;
				}
			}
		}
	}
	
	return 0;
}