#include "bits/stdc++.h" // #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; using ll = long long int; mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); struct input_checker { string buffer; int pos; const string all = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; const string number = "0123456789"; const string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string lower = "abcdefghijklmnopqrstuvwxyz"; input_checker() { pos = 0; while (true) { int c = cin.get(); if (c == -1) { break; } buffer.push_back((char) c); } } int nextDelimiter() { int now = pos; while (now < (int) buffer.size() && buffer[now] != ' ' && buffer[now] != '\n') { now++; } return now; } string readOne() { assert(pos < (int) buffer.size()); int nxt = nextDelimiter(); string res; while (pos < nxt) { res += buffer[pos]; pos++; } // cerr << res << endl; return res; } string readString(int minl, int maxl, const string &pattern = "") { assert(minl <= maxl); string res = readOne(); assert(minl <= (int) res.size()); assert((int) res.size() <= maxl); for (int i = 0; i < (int) res.size(); i++) { assert(pattern.empty() || pattern.find(res[i]) != string::npos); } return res; } int readInt(int minv, int maxv) { assert(minv <= maxv); int res = stoi(readOne()); assert(minv <= res); assert(res <= maxv); return res; } long long readLong(long long minv, long long maxv) { assert(minv <= maxv); long long res = stoll(readOne()); assert(minv <= res); assert(res <= maxv); return res; } void readSpace() { assert((int) buffer.size() > pos); assert(buffer[pos] == ' '); pos++; } void readEoln() { assert((int) buffer.size() > pos); assert(buffer[pos] == '\n'); pos++; } void readEof() { assert((int) buffer.size() == pos); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); input_checker inp; int t = inp.readInt(1, 1000); inp.readEoln(); int sumN = 0; while (t--) { int n = inp.readInt(1, 1000); inp.readEoln(); sumN += n; vector<int> p(n); for (int i = 0; i < n; ++i) { p[i] = inp.readInt(1, n); if (i+1 < n) inp.readSpace(); else inp.readEoln(); } vector<array<int, 2>> ans; auto fix = [&] (int L1, int R1, int L2, int R2) { while (L1 < L2) { if (p[L1] < p[L2]) { ++L1; continue; } // Move p[L1] as far right as possible int pos = lower_bound(begin(p)+L2, begin(p)+R2+1, p[L1]) - begin(p); ans.push_back({L1+1, pos}); swap(p[L1], p[pos-1]); } }; int R1 = 0, R2 = 0; while (1) { while (R1+1 < n and p[R1] < p[R1+1]) ++R1; if (R1+1 == n) break; R2 = R1+1; while (R2+1 < n and p[R2] < p[R2+1]) ++R2; fix(0, R1, R1+1, R2); R1 = R2; } assert(size(ans) <= n*n); cout << size(ans) << '\n'; for (auto [x, y] : ans) cout << x << ' ' << y << '\n'; for (int i = 0; i < n; ++i) assert(p[i] == i+1); } assert(sumN <= 1000); inp.readEof(); }