Advertisement
Jasir

merge sort tree

Jun 18th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. //kth_element
  2. vector <int> tree[mx*4];
  3.  
  4. void init(int node, int b, int e){
  5.     if (b == e) {
  6.         tree[node].push_back(u[b-1].se);
  7.         return;
  8.     }
  9.     int Left = node * 2;
  10.     int Right = node * 2 + 1;
  11.     int mid = (b + e) / 2;
  12.     init(Left, b, mid);
  13.     init(Right, mid + 1, e);
  14.     tree[node].resize(tree[Right].size()+tree[Left].size());
  15.     merge(tree[Left].begin(), tree[Left].end(), tree[Right].begin(), tree[Right].end(), tree[node].begin());
  16.     //if(node==1) for(auto a: tree[node]) cout << a.se << " -> " << a.fi << endl;
  17. }
  18.  
  19. int query(int node, int b, int e, int i, int j, int k){
  20.     if(b==e) return tree[node][0];
  21.     int Left = node * 2;
  22.     int Right = node * 2 + 1;
  23.     int mid = (b + e) / 2;
  24.     int r = upper_bound(tree[Left].begin(), tree[Left].end(), j) - tree[Left].begin();
  25.     int l = lower_bound(tree[Left].begin(), tree[Left].end(), i) - tree[Left].begin();
  26.     int m = r - l;
  27.     if(m >= k) return query(Left, b, mid, i, j, k);
  28.     else return query(Right, mid+1, e, i, j, k-m);
  29. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement