#include #include //#include using std::vector; long mergeInversionCount(vector &B, vector &C, vector &D) { long count = 0; while (B.size() != 0 && C.size() != 0) { int b = B[0]; int c = C[0]; if (b <= c) { D.push_back(b); B.erase(B.begin()); } else { count += B.size(); D.push_back(c); C.erase(C.begin()); } } D.insert(D.end(), B.begin(), B.end()); D.insert(D.end(), C.begin(), C.end()); return count; } long getInversionCountFromList(vector &A, vector &D) { long numberOfInversions = 0; if (A.size() == 1) { D.push_back(A[0]); return 0; } int m = A.size() / 2; vector D1; vector::const_iterator first = A.begin(); vector::const_iterator last = A.begin() + m; vector newVec(first, last); numberOfInversions += getInversionCountFromList(newVec, D1); vector D2; vector::const_iterator ffirst = A.begin() + m; vector::const_iterator llast = A.end(); vector newVecc(ffirst, llast); numberOfInversions += getInversionCountFromList(newVecc, D2); long mergeCount = mergeInversionCount(D1, D2, D); return numberOfInversions + mergeCount; } //TEST(InversionCount, test1) { // vector a = { 2, 3, 9, 2, 2 }; // vector result(5); // ASSERT_EQ(4, getInversionCountFromList(a, result)); //} int main() { int n; std::cin >> n; vector a(n); for (size_t i = 0; i < a.size(); i++) { std::cin >> a[i]; } vector b(a.size()); std::cout << getInversionCountFromList(a, b) << '\n'; }