Advertisement
Jasir

2D segment tree

Jun 19th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. int m;
  2. int tree[1505][1505], ara[505][505];
  3.  
  4. void build_y (int vx, int lx, int rx, int vy, int ly, int ry) {
  5.     if (ly == ry)
  6.         if (lx == rx)
  7.             tree[vx][vy] = ara[lx][ly];
  8.         else
  9.             tree[vx][vy] = max(tree[vx*2][vy], tree[vx*2+1][vy]);
  10.     else {
  11.         int my = (ly + ry) / 2;
  12.         build_y (vx, lx, rx, vy*2, ly, my);
  13.         build_y (vx, lx, rx, vy*2+1, my+1, ry);
  14.         tree[vx][vy] = max(tree[vx][vy*2], tree[vx][vy*2+1]);
  15.     }
  16. }
  17.  
  18. void build_x (int vx, int lx, int rx) {
  19.     if (lx != rx) {
  20.         int mx = (lx + rx) / 2;
  21.         build_x (vx*2, lx, mx);
  22.         build_x (vx*2+1, mx+1, rx);
  23.     }
  24.     build_y (vx, lx, rx, 1, 1, m);
  25. }
  26.  
  27. void update_y (int vx, int lx, int rx, int vy, int ly, int ry, int x, int y, int new_val) {
  28.     if (ly == ry) {
  29.         if (lx == rx)
  30.             tree[vx][vy] = new_val;
  31.         else
  32.             tree[vx][vy] = max(tree[vx*2][vy], tree[vx*2+1][vy]);
  33.     }
  34.     else {
  35.         int my = (ly + ry) / 2;
  36.         if (y <= my)
  37.             update_y (vx, lx, rx, vy*2, ly, my, x, y, new_val);
  38.         else
  39.             update_y (vx, lx, rx, vy*2+1, my+1, ry, x, y, new_val);
  40.         tree[vx][vy] = max(tree[vx][vy*2], tree[vx][vy*2+1]);
  41.     }
  42. }
  43.  
  44. void update_x (int vx, int lx, int rx, int x, int y, int new_val) {
  45.     if (lx != rx) {
  46.         int mx = (lx + rx) / 2;
  47.         if (x <= mx)
  48.             update_x (vx*2, lx, mx, x, y, new_val);
  49.         else
  50.             update_x (vx*2+1, mx+1, rx, x, y, new_val);
  51.     }
  52.     update_y (vx, lx, rx, 1, 1, m, x, y, new_val);
  53. }
  54.  
  55. int get_y (int vx, int vy, int tly, int try_, int ly, int ry) {
  56.     if (ly > ry)
  57.         return 0;
  58.     if (ly == tly && try_ == ry)
  59.         return tree[vx][vy];
  60.     int tmy = (tly + try_) / 2;
  61.     return max(get_y (vx, vy*2, tly, tmy, ly, min(ry,tmy)), get_y (vx, vy*2+1, tmy+1, try_, max(ly,tmy+1), ry));
  62. }
  63.  
  64. int get_x (int vx, int tlx, int trx, int lx, int rx, int ly, int ry) {
  65.     if (lx > rx)
  66.         return 0;
  67.     if (lx == tlx && trx == rx)
  68.         return get_y (vx, 1, 1, m, ly, ry);
  69.     int tmx = (tlx + trx) / 2;
  70.     return max(get_x (vx*2, tlx, tmx, lx, min(rx,tmx), ly, ry), get_x (vx*2+1, tmx+1, trx, max(lx,tmx+1), rx, ly, ry));
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement