愚直にシミュレーションすると O(N2Q)\mathcal{O}(N^2Q)になりTLEしていまいます。Fenwick Treeを用いて転倒数を高速に求めても O(NQlogN)\mathcal{O}(NQlogN) になり厳しいです。

転倒数は左りに整数 ii があり、右に整数 jj があるようなペア (i,j)(i, j) で影響されます。

例として (0,1,1,0)(0, 1, 1, 0) ではペア (0,0),(0,1),(1,0),(1,1)(0, 0), (0, 1), (1, 0), (1, 1) がそれぞれ 1, 2, 2, 1個あります。

そのようなペアは (i,j)(i, j) (0i,j9)(0 \leq i, j \leq 9) の100通りしかありません。これらのペアの中で (i>j)(i > j) を満足するペアの個数が転倒数となります。上の数列では (1,0)(1, 0) の個数 2 が転倒数となります。

また、クエリごとに変化した数列のペアも100種類しかないです。また、ペアは (i,j)(i, j) から (ti,tj)(t_i, t_j) に変化します。

よってクエリごとに数列の要素の種類数を MM とすると O(M2)\mathcal{O}(M^2) の計算量で転倒数を計算できます。

最初にペアの個数を計算するのに O(N2)\mathcal{O}(N^2) かかるため、この問題が O(N2+QM2)\mathcal{O}(N^2 + QM^2) (M=10)(M = 10) で解けました。

実装例(c++)

c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main()
{
    int n, q; cin >> n >> q;
    vector<int> p(n);
    for(int i = 0; i < n; i++) cin >> p[i];

    vector<vector<int>> v(10, vector<int>(10, 0));

    for(int i = 0; i < n; i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            v[p[i]][p[j]]++;
        }
    }

    while(q--)
    {
        vector<int> t(10);
        for(int i = 0; i < 10; i++) cin >> t[i];
        int ans = 0;

        for(int i = 0; i < 10; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                if(t[i] > t[j]) ans += v[i][j];
            }
        }
        cout << ans << '\n';
    }
}