Advertisement
Jasir

merged segment tree

May 9th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. void init(int node, int b, int e){
  2.     if (b == e) {
  3.         tree[node].push_back({sub[eu[b-1]], eu[b-1]});
  4.         return;
  5.     }
  6.     int Left = node * 2;
  7.     int Right = node * 2 + 1;
  8.     int mid = (b + e) / 2;
  9.     init(Left, b, mid);
  10.     init(Right, mid + 1, e);
  11.     tree[node].resize(tree[Right].size()+tree[Left].size());
  12.     merge(tree[Left].begin(), tree[Left].end(), tree[Right].begin(), tree[Right].end(), tree[node].begin());
  13.     //if(node==1) for(auto a: tree[node]) cout << a.se << " -> " << a.fi << endl;
  14. }
  15.  
  16. pii query(int node, int b, int e, int i, int j, int num){
  17.     if (i > e || j < b)
  18.         return {inf, inf};
  19.     if (b >= i && e <= j){
  20.         pii t = {num, -1};
  21.         int l = lower_bound(tree[node].begin(), tree[node].end(), t) - tree[node].begin();
  22.         if(l == tree[node].size()) return {inf, inf};
  23.         return tree[node][l];
  24.     }
  25.     int Left = node * 2;
  26.     int Right = node * 2 + 1;
  27.     int mid = (b + e) / 2;
  28.     pii p1 = query(Left, b, mid, i, j, num);
  29.     pii p2 = query(Right, mid + 1, e, i, j, num);
  30.     return min(p1, p2);
  31. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement