#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template struct BinaryIndexedTree { private: int N; vector node; public: BinaryIndexedTree() : N(0) {} BinaryIndexedTree(int N) : N(N), node(N) {} void add(int pos,T x) { assert(0 <= pos && pos < N); pos++; while(pos <= N) { node[pos-1] += x; pos += pos & -pos; } } T sum(int l,int r) { assert(0 <= l && l <= N && r <= N); return sum(r) - sum(l); } T sum(int r) { T ret = 0; while(r > 0) { ret += node[r-1]; r -= r & -r; } return ret; } T sum() {return sum(N);} }; void Main() { int N; cin >> N; vector P(N); for(int i = 0;i < N;i++) { cin >> P[i]; P[i]--; } vector F(N); { BinaryIndexedTree BIT(N); BIT.add(P[0],1); int prev = P[0]; for(int i = 1;i < N;i++) { int u = BIT.sum(P[i],N); int l = BIT.sum(0,P[i]); if(l < u) { F[i] = 1; prev = P[i]; } else if(l == u) { if(P[i] < prev) { F[i] = 1; prev = P[i]; } } BIT.add(P[i],1); } } vector ans; for(int i = N - 1;i >= 0;i--) { if(F[i]) { ans.push_back(P[i]); } } for(int i = 0;i < N;i++) { if(!F[i]) { ans.push_back(P[i]); } } long long inv = 0; BinaryIndexedTree BIT(N); for(int i = 0;i < N;i++) { inv += BIT.sum(ans[i],N); BIT.add(ans[i],1); } cout << inv << "\n"; for(int i = 0;i < N;i++) { cout << ++ans[i] << (i + 1 == N ? "\n" : " "); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt = 1; cin >> tt; while(tt--) Main(); }