Advertisement
Jasir

Li Chao tree

Mar 20th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1.  
  2. int val[mx];
  3. const int maxn = mx;
  4. typedef int ftype;
  5. typedef complex<ftype> point;
  6. #define x real
  7. #define y imag
  8.  
  9. ftype dot(point a, point b) {
  10.     return (conj(a) * b).x();
  11. }
  12.  
  13. ftype f(point a,  ftype x) {
  14.     return dot(a, {x, 1});
  15. }
  16.  
  17. point line[5 * maxn];
  18.  
  19. void add_line(point nw, int v = 1, int l = 0, int r = maxn) {
  20.     int m = (l + r) / 2;
  21.     bool lef = f(nw, val[l]) < f(line[v], val[l]);
  22.     bool mid = f(nw, val[m]) < f(line[v], val[m]);
  23.     if(mid) {
  24.         swap(line[v], nw);
  25.     }
  26.     if(r - l == 1) {
  27.         return;
  28.     } else if(lef != mid) {
  29.         add_line(nw, 2 * v, l, m);
  30.     } else {
  31.         add_line(nw, 2 * v + 1, m, r);
  32.     }
  33. }
  34.  
  35. int get(int x, int v = 1, int l = 0, int r = maxn) {
  36.     int m = (l + r) / 2;
  37.     if(r - l == 1) {
  38.         return f(line[v], x);
  39.     } else if(x < val[m]) {
  40.         return min(f(line[v], x), get(x, 2 * v, l, m));
  41.     } else {
  42.         return min(f(line[v], x), get(x, 2 * v + 1, m, r));
  43.     }
  44. }
  45.  
  46. void init(){
  47.     int mm = inf;
  48.     for(int i=0;i<5*maxn;i++){
  49.         line[i] = {0, mm};
  50.     }
  51.     for(int i=0;i<maxn;i++){
  52.         val[i] = mod;
  53.     }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement