Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- int inversionCount(vector<int>& a, int l, int r) {
- if(l >= r) return 0;
- int m = (l + r) / 2;
- int inv = inversionCount(a, l, m) + inversionCount(a, m+1, r);
- int pt = m+1;
- for(int i = l; i <= m; i++) {
- while(pt <= r && a[pt] < a[i]) pt++;
- inv += pt - (m+1);
- }
- // merging both parts
- vector<int> temp;
- int pl = l, pr = m+1;
- while(pl <= m && pr <= r) if(a[pl] < a[pr]) temp.push_back(a[pl++]); else temp.push_back(a[pr++]);
- while(pl <= m) temp.push_back(a[pl++]);
- while(pr <= r) temp.push_back(a[pr++]);
- for(int i = 0; i < r-l+1; i++) a[l+i] = temp[i];
- return inv;
- }
- vector<string> weightParity(int n, int q, vector<int> &arr, vector<vector<int>> &queries) {
- vector<string> ans(q);
- vector<int> inv(n), vis(n);
- for(int i = 0; i < n; i++) inv[arr[i]-1] = i;
- int parity = 0;
- for(int i = 0; i < n; i++) {
- if(vis[i]) continue;
- int cycle_len = 0, idx = i;
- while(!vis[idx]) {
- vis[idx] = 1;
- cycle_len++;
- idx = inv[idx];
- }
- parity ^= cycle_len % 2 == 0;
- }
- // alternative : calculate parity using merge sort
- parity = inversionCount(arr, 0, n-1) % 2;
- for(int z = 0; z < q; z++) {
- int len = queries[z][1] - queries[z][0] + 1;
- parity ^= (len / 2) % 2;
- ans[z] = parity ? "odd" : "even";
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement