#include #include #include #include int A[999999], W[999999]; long long merge_and_count(int l, int r) { // range [l,r) if (l+1 >= r) return 0; // empty if (l+2 == r) { // [l,r) == [l,l+1] 要素2つだけ if (A[l] <= A[l+1]) return 0; // 逆転はなし std::swap(A[l], A[l+1]); return 1; // 逆転一つ } int m = (l+r)/2; // [l,r) == [l,m) + [m,r) long long cl = merge_and_count(l, m); // 左半分を再帰的に数える long long cr = merge_and_count(m, r); // 右半分を再帰的に数える long long c = 0; // 左と右を混ぜるときの逆転数 int i=l, j=m; // iは[l,m)を動き, jは[m,r)を動いて、 int k=l; // 小さいものから W[k] に書き込む while (i