rt
#include <cstdio>
#include <vector>
using namespace std;
const int N = 305;
const int M = 2000005;
const int K = 605;
int op_ans[M * 2], s1_ans[M * 2], s2_ans[M * 2], cnt;
void print() {
printf("%d\n", cnt);
for (int i = 1; i <= cnt; i++) {
printf("%d %d", op_ans[i], s1_ans[i]);
if (op_ans[i] == 2) {
printf(" %d", s2_ans[i]);
}
printf("\n");
}
}
vector < int > stack[N];
void op1(int s, int x) {
cnt++;
op_ans[cnt] = 1;
s1_ans[cnt] = s;
if (stack[s].size() != 0 && stack[s].back() == x) {
stack[s].pop_back();
} else {
stack[s].push_back(x);
}
}
void op2(int s1, int s2) {
cnt++;
op_ans[cnt] = 2;
s1_ans[cnt] = s1;
s2_ans[cnt] = s2;
if (stack[s1].size() == 0 || stack[s2].size() == 0 || stack[s1][0] != stack[s2][0]) {
printf("Error.\n");
} else {
stack[s1].erase(stack[s1].begin());
stack[s2].erase(stack[s2].begin());
}
}
int a[M], belong[K], f[K];
int main() {
int T;
scanf("%d", &T);
for (int n, m, k; T != 0; T--) {
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
scanf("%d", &a[i]);
}
int empty = n;
cnt = 0;
for (int i = 1; i <= m; ) {
int x = belong[a[i]];
if (x != 0) {
if (stack[x].back() == a[i]) {
op1(x, a[i]);
} else {
op1(empty, a[i]);
op2(empty, x);
}
belong[a[i]] = 0;
i++;
} else {
int ok = 0;
for (int j = 1; j <= n; j++) {
if (j != empty && stack[j].size() <= 1) {
ok = j;
}
}
if (ok == 0) {
for (int j = 1; j <= k; j++) {
f[j] = 0;
}
for (int j = 1; j <= n; j++) {
if (j != empty) {
f[stack[j][0]] = j;
}
}
f[a[i]] = n + 1;
int want = 0;
for (int j = i + 1; ; j++) {
if (j > m) {
return 114514;
}
if (f[a[j]] != 0) {
want = j;
break;
}
}
if (f[a[want]] == n + 1) {
op1(empty, a[i]);
for (int j = i + 1; j <= want - 1; j++) {
int x = belong[a[j]];
if (x != 0) {
op1(x, a[j]);
belong[a[j]] = 0;
} else {
int ok = 0;
for (int p = 1; p <= n; p++) {
if (p != empty && stack[p].size() <= 1) {
ok = p;
}
}
op1(ok, a[j]);
belong[a[j]] = ok;
}
}
op1(empty, a[want]);
} else {
int result = f[a[want]];
int y = stack[result][1];
int z = stack[result][0];
int cnt = 0;
for (int j = i; j <= want; j++) {
if (a[j] == y) {
cnt++;
}
}
if (cnt % 2 == 0) {
op1(result, a[i]);
belong[a[i]] = result;
for (int j = i + 1; j <= want - 1; j++) {
if (a[j] == y) {
op1(result, y);
} else {
int x = belong[a[j]];
if (x != 0) {
if (stack[x].back() == a[j]) {
op1(x, a[j]);
} else {
op1(empty, a[j]);
op2(empty, x);
}
belong[a[j]] = 0;
} else {
int ok = 0;
for (int p = 1; p <= n; p++) {
if (p != empty && stack[p].size() <= 1) {
ok = p;
}
}
op1(ok, a[j]);
belong[a[j]] = ok;
}
}
}
op1(empty, z);
op2(empty, belong[z]);
belong[z] = 0;
} else {
op1(empty, a[i]);
belong[a[i]] = empty;
for (int j = i + 1; j <= want - 1; j++) {
if (a[j] == y) {
op1(result, y);
} else {
int x = belong[a[j]];
if (x != 0) {
if (stack[x].back() == a[j]) {
op1(x, a[j]);
} else {
op1(empty, a[j]);
op2(empty, x);
}
belong[a[j]] = 0;
} else {
int ok = 0;
for (int p = 1; p <= n; p++) {
if (p != empty && stack[p].size() <= 1) {
ok = p;
}
}
op1(ok, a[j]);
belong[a[j]] = ok;
}
}
}
belong[y] = 0;
op1(result, z);
belong[z] = 0;
empty = result;
}
}
i = want + 1;
} else {
op1(ok, a[i]);
belong[a[i]] = ok;
i++;
}
}
}
print();
}
return 0;
}
第 83 行出错了。