BotByte

Merge Sort Tree

May 3rd, 2018
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. /*
  2.     Author : M. A. Rafsan Mazumder
  3.     *** Merge Sort Tree (Segment Tree with vectors) ***
  4.     Time and Space Complexity (Build) : O(nlogn)
  5.     For point update, policy based data structure is needed - Build Complexity : O(n * (logn)^2)
  6.                                                              Update : O((logn)^2)
  7.     Code : Count the numbers of elements greater than a given value(k) in a range(i, j)
  8.     Problem : http://www.spoj.com/problems/KQUERYO/
  9.     Query Complexity : O((logn)^2)
  10. */
  11.  
  12. #include <bits/stdc++.h>
  13.  
  14. using namespace std;
  15.  
  16. #define MAX 30005
  17. int arr[MAX], n, q;
  18. vector<int> tree[4*MAX];
  19.  
  20. vector<int> mergeAll(vector<int> V1, vector<int> V2)
  21. {
  22.     vector<int> V( (int)V1.size()+(int)V2.size() ); // Preallocate Memory
  23.     merge(V1.begin(), V1.end(), V2.begin(), V2.end(), V.begin());
  24.     return V;
  25. }
  26.  
  27. void init(int node, int b, int e)
  28. {
  29.     if(b == e){
  30.         tree[node].push_back(arr[b]);
  31.         return;
  32.     }
  33.     int left = 2*node;
  34.     int right = 2*node+1;
  35.     int mid = (b+e)/2;
  36.     init(left, b, mid);
  37.     init(right, mid+1, e);
  38.     tree[node] = mergeAll(tree[left], tree[right]);
  39. }
  40.  
  41. int query(int node, int b, int e, int l, int r, int val)
  42. {
  43.     if(l > r) return 0;
  44.     if(l > e || r < b) return 0;
  45.     if(b >= l && e <= r){
  46.         int it = upper_bound(tree[node].begin(), tree[node].end(), val) - tree[node].begin();
  47.         int cnt = tree[node].size() - it;
  48.         return cnt;
  49.     }
  50.     int left = 2*node;
  51.     int right = 2*node+1;
  52.     int mid = (b+e)/2;
  53.     int p1 = query(left, b, mid, l, r, val);
  54.     int p2 = query(right, mid+1, e, l, r, val);
  55.     return p1+p2;
  56. }
  57.  
  58. int main()
  59. {
  60.     scanf("%d", &n);
  61.     for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
  62.     init(1, 1, n);
  63.     int last = 0;
  64.     scanf("%d", &q);
  65.     while(q--){
  66.         int a, b, c;
  67.         scanf("%d %d %d", &a, &b, &c);
  68.         int i = a^last, j = b^last, k = c^last;
  69.         i = max(i, 1);
  70.         j = min(j, n);
  71.         last = query(1, 1, n, i, j, k);
  72.         printf("%d\n", last);
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment