Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <vector>
- using namespace std;
- using ull = unsigned long long;
- ull ans;
- vector <ull> arr;
- ull merge (ull b, ull m, ull e) {
- queue <ull> left;
- queue <ull> right;
- for (ull i = b; i <= m; ++i) left.push(arr[i]);
- for (ull i = m + 1; i <= e; ++i) right.push(arr[i]);
- ull idx = b, out = 0;
- while (!left.empty() && !right.empty()) {
- if (left.front() <= right.front()) {
- arr[idx++] = left.front();
- left.pop();
- }
- else {
- arr[idx++] = right.front();
- right.pop();
- out += left.size();
- }
- }
- while (!left.empty()) {
- arr[idx++] = left.front();
- left.pop();
- }
- while (!right.empty()) {
- arr[idx++] = right.front();
- right.pop();
- }
- return out;
- }
- void mergesort(ull b, ull e) {
- if (b < e) {
- ull m = ((b + e) / 2);
- mergesort(b, m);
- mergesort(m + 1, e);
- ans += merge(b, m, e);
- }
- }
- int main() {
- ull n; cin >> n;
- for (ull i = 0; i < n; ++i) {
- ull e; cin >> e;
- arr.push_back(e);
- }
- mergesort(0, n - 1);
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement