提交时间:2024-11-03 19:55:02

运行 ID: 34196

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e6 + 9; int n, L, a[N], b[N]; int op[N][3], tp; void opr(int x, int y, int z) { op[++tp][0] = x, op[tp][1] = y, op[tp][2] = z; if (a[x] > a[z]) swap(a[x], a[y]), swap(b[a[x]], b[a[y]]); else swap(a[y], a[z]), swap(b[a[y]], b[a[z]]); } void slv() { scanf("%d%d", &n, &L); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); b[a[i]] = i; } if (n == 1) { printf("0\n"); return; } else if (n == 2) { if (a[1] == 1) printf("0\n"); else printf("-1\n"); return; } else if (n == 3) { if (a[1] == 1) { if (a[2] == 2) printf("0\n"); else printf("1\n1 2 3\n"); } else if (a[1] == 3) { if (a[2] == 2) printf("-1\n"); else printf("2\n1 2 3\n1 2 3\n"); } else { printf("0\n"); } return; } else if (a[n] == 1) { printf("-1\n"); return; } tp = 0; if (a[1] != 1) { for (int i = b[1] + 1; i <= n; i++) { if (a[i] < a[1]) { opr(1, b[1], i); break; } } if (!tp) { if (a[1] == 2) { if (a[2] == 1) { int x = 0; for (int i = n - 1; i >= 1; i--) { if (a[i] > a[i + 1]) {x = i; break;} } if (x == 1) { if (n == 4 && L == 4) printf("-1\n"); else printf("5\n1 2 3\n1 2 3\n1 2 4\n1 3 4\n1 2 4\n"); return; } else { opr(1, 2, x), opr(1, 2, x), opr(1, x, x + 1); } } else { if (b[n] < b[1]) opr(1, b[n], b[1]), opr(1, b[1], n); else opr(1, 2, b[n]), opr(1, 2, b[1]), opr(1, b[1], n); } } else { int x = 2; while (a[x] > a[1]) x++; opr(1, x, n), opr(1, b[1], n); } } } for (int i = 2; i <= n; i++) { if (a[i] != i) opr(1, i, b[i]); } printf("%d\n", tp); for (int i = 1; i <= tp; i++) printf("%d %d %d\n", op[i][0], op[i][1], op[i][2]); } signed main() { int T; scanf("%d", &T); while (T--) slv(); return 0; }