rt,石山代码调了两个多小时了(
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int T, n, m, k, a[N], top[605], bot[605], emp, op[N], id1[N], id2[N], pos;
deque<int> stk[605], lst;
int push(int val) {
if (top[val]) {
int idx = top[val];
top[val] = bot[val] = 0;
op[++pos] = 1, id1[pos] = idx;
stk[idx].pop_back();
if (stk[idx].size()) {
top[stk[idx].back()] = idx;
lst.push_back(idx);
} return 1;
} else if (bot[val]) {
int idx = bot[val];
top[val] = bot[val] = 0;
op[++pos] = 1, id1[pos] = emp;
op[++pos] = 2, id1[pos] = idx, id2[pos] = emp;
stk[idx].pop_front();
if (stk[idx].size()) {
bot[stk[idx].front()] = idx;
lst.push_front(idx);
} return 2;
} else {
if (!lst.size()) return 0;
int idx = lst.front();
lst.pop_front();
if (stk[idx].size()) top[stk[idx].back()] = 0;
op[++pos] = 1, id1[pos] = idx;
stk[idx].push_back(val);
top[val] = idx;
if (stk[idx].size() == 1) bot[val] = idx;
if (stk[idx].size() < 2) lst.push_front(idx);
return 3;
}
}
int main() {
scanf("%d", &T);
while (T--) {
while (lst.size()) lst.pop_back();
pos = 0;
memset(top, 0, sizeof top);
memset(bot, 0, sizeof bot);
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) while (stk[i].size()) stk[i].pop_back();
for (int i = 1; i <= m; i++) scanf("%d", a + i);
for (int i = 1; i < n; i++) lst.push_back(i);
emp = n;
for (int i = 1; i <= m; i++) {
int t = push(a[i]);
if (!t) {
int j = i + 1, cnt = 0;
while (!bot[a[j]] && a[j] != a[i]) j++;
if (a[i] == a[j]) {
op[++pos] = 1, id1[pos] = emp;
for (int k = i + 1; k < j; k++) push(a[k]);
op[++pos] = 1, id1[pos] = emp;
} else {
int idx = bot[a[j]];
for (int k = i + 1; k < j; k++)
if (a[k] == stk[idx].back()) cnt++;
if (cnt & 1) {
op[++pos] = 1, id1[pos] = emp;
for (int k = i + 1; k < j; k++) {
if (a[k] == stk[idx].back()) op[++pos] = 1, id1[pos] = idx;
else push(a[k]);
}
top[stk[idx].back()] = 0;
stk[idx].pop_back();
op[++pos] = 1, id1[pos] = idx;
bot[stk[idx].back()] = 0;
stk[idx].pop_back();
top[a[i]] = bot[a[i]] = emp;
lst.push_back(emp);
emp = idx;
} else {
op[++pos] = 1, id1[pos] = idx;
for (int k = i + 1; k < j; k++) {
if (a[k] == stk[idx].back()) op[++pos] = 1, id1[pos] = emp;
else push(a[k]);
}
op[++pos] = 1, id1[pos] = emp;
op[++pos] = 2, id1[pos] = idx, id2[pos] = emp;
bot[stk[idx].front()] = 0;
stk[idx].pop_front();
top[stk[idx].front()] = 0;
bot[stk[idx].front()] = idx;
stk[idx].push_back(a[i]);
top[stk[idx].front()] = idx;
}
} i = j;
}
}
printf("%d\n", pos);
for (int i = 1; i <= pos; i++) {
if (op[i] == 1) printf("1 %d\n", id1[i]);
else printf("2 %d %d\n", id1[i], id2[i]);
}
}
return 0;
}