Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vector <int> d[4000000];
- void make_tree(int arr[], int v, int tl, int tr)
- {
- if (tl == tr)
- {
- d[v] = vector<int>(1, arr[tl]);
- }
- else
- {
- int tm = (tl + tr) / 2;
- make_tree(arr, v*2, tl, tm);
- make_tree(arr, v*2+1, tm+1, tr);
- merge(d[v * 2].begin(), d[v * 2].end(), d[v * 2 + 1].begin(), d[v * 2 + 1].end(), back_inserter(d[v]));
- }
- }
- int findup(int v, int tl, int tr, int ln, int rn, int search)
- {
- if (ln > rn)
- return 1e9+2;
- if (ln == tl&&rn == tr)
- {
- auto i = lower_bound(d[v].begin(), d[v].end(), search);
- if(i!=d[v].end())
- {
- return *i;
- }
- else
- return 1e9 + 2;
- }
- int tm = (tl + tr) / 2;
- return min(findup(v * 2, tl, tm, ln, min(tm, rn), search), findup(v * 2+1, tm + 1, tr, max(tm + 1, ln), rn, search));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement