Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void init(int node, int b, int e){
- if (b == e) {
- tree[node].push_back({sub[eu[b-1]], eu[b-1]});
- return;
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- init(Left, b, mid);
- init(Right, mid + 1, e);
- tree[node].resize(tree[Right].size()+tree[Left].size());
- merge(tree[Left].begin(), tree[Left].end(), tree[Right].begin(), tree[Right].end(), tree[node].begin());
- //if(node==1) for(auto a: tree[node]) cout << a.se << " -> " << a.fi << endl;
- }
- pii query(int node, int b, int e, int i, int j, int num){
- if (i > e || j < b)
- return {inf, inf};
- if (b >= i && e <= j){
- pii t = {num, -1};
- int l = lower_bound(tree[node].begin(), tree[node].end(), t) - tree[node].begin();
- if(l == tree[node].size()) return {inf, inf};
- return tree[node][l];
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- pii p1 = query(Left, b, mid, i, j, num);
- pii p2 = query(Right, mid + 1, e, i, j, num);
- return min(p1, p2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement