Advertisement
artemgf

Дерево отрезков число больше данного.

Nov 28th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.76 KB | None | 0 0
  1. vector <int> d[4000000];
  2. void make_tree(int arr[], int v, int tl, int tr)
  3. {
  4.     if (tl == tr)
  5.     {
  6.         d[v] = vector<int>(1, arr[tl]);
  7.     }
  8.     else
  9.     {
  10.         int tm = (tl + tr) / 2;
  11.         make_tree(arr, v*2, tl, tm);
  12.         make_tree(arr, v*2+1, tm+1, tr);
  13.         merge(d[v * 2].begin(), d[v * 2].end(), d[v * 2 + 1].begin(), d[v * 2 + 1].end(), back_inserter(d[v]));
  14.     }
  15. }
  16.  
  17. int findup(int v, int tl, int tr, int ln, int rn, int search)
  18. {
  19.     if (ln > rn)
  20.         return 1e9+2;
  21.     if (ln == tl&&rn == tr)
  22.     {
  23.         auto i = lower_bound(d[v].begin(), d[v].end(), search);
  24.         if(i!=d[v].end())
  25.         {
  26.             return *i;
  27.         }
  28.         else
  29.             return 1e9 + 2;
  30.     }
  31.  
  32.     int tm = (tl + tr) / 2;
  33.     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));
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement