Advertisement
vinayak7989

Untitled

Sep 25th, 2022
764
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. int inversionCount(vector<int>& a, int l, int r) {
  3.     if(l >= r) return 0;
  4.     int m = (l + r) / 2;
  5.     int inv = inversionCount(a, l, m) + inversionCount(a, m+1, r);
  6.     int pt = m+1;
  7.     for(int i = l; i <= m; i++) {
  8.         while(pt <= r && a[pt] < a[i]) pt++;
  9.         inv += pt - (m+1);
  10.     }
  11.     // merging both parts
  12.     vector<int> temp;
  13.     int pl = l, pr = m+1;
  14.     while(pl <= m && pr <= r) if(a[pl] < a[pr]) temp.push_back(a[pl++]); else temp.push_back(a[pr++]);
  15.     while(pl <= m) temp.push_back(a[pl++]);
  16.     while(pr <= r) temp.push_back(a[pr++]);
  17.     for(int i = 0; i < r-l+1; i++) a[l+i] = temp[i];
  18.     return inv;
  19. }
  20. vector<string> weightParity(int n, int q, vector<int> &arr, vector<vector<int>> &queries) {
  21.     vector<string> ans(q);
  22.     vector<int> inv(n), vis(n);
  23.     for(int i = 0; i < n; i++) inv[arr[i]-1] = i;
  24.     int parity = 0;
  25.     for(int i = 0; i < n; i++) {
  26.         if(vis[i]) continue;
  27.         int cycle_len = 0, idx = i;
  28.         while(!vis[idx]) {
  29.             vis[idx] = 1;
  30.             cycle_len++;
  31.             idx = inv[idx];
  32.         }
  33.         parity ^= cycle_len % 2 == 0;
  34.     }
  35.     // alternative : calculate parity using merge sort
  36.     parity = inversionCount(arr, 0, n-1) % 2;
  37.     for(int z = 0; z < q; z++) {
  38.         int len = queries[z][1] - queries[z][0] + 1;
  39.         parity ^= (len / 2) % 2;
  40.         ans[z] = parity ? "odd" : "even";
  41.     }
  42.     return ans;
  43. }
  44.  
Tags: C++
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement