Advertisement
Guest User

Untitled

a guest
Apr 24th, 2016
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.65 KB | None | 0 0
  1. /** FenWick Minimum Tree for Range Minimum Queries by baobab */
  2.  
  3. /** http://stackoverflow.com/questions/31106459/how-to-adapt-fenwick-tree-to-answer-range-minimum-queries/34602284#34602284 */
  4.  
  5. class FenwickMin implements RMQ {
  6.     long n;
  7.     long[] original;
  8.     long[] bottomUp;
  9.     long[] topDown;
  10.  
  11.     public FenwickMin(int n) {
  12.         this.n = n;
  13.         original = new long[n+2];
  14.         bottomUp = new long[n+2];
  15.         topDown = new long[n+2];
  16.     }
  17.    
  18.     @Override
  19.     public void set(int modifiedNode, long value) {
  20.         long replaced = original[modifiedNode];
  21.         original[modifiedNode] = value;
  22.         // Update left tree
  23.         int i = modifiedNode;
  24.         long v = value;
  25.         while (i <= n) {
  26.             if (v > bottomUp[i]) {
  27.                 if (replaced == bottomUp[i]) {
  28.                     v = Math.min(v, original[i]);
  29.                     for (int r=1 ;; r++) {
  30.                         int x = (i&-i)>>>r;
  31.                         if (x == 0) break;
  32.                         int child = i-x;
  33.                         v = Math.min(v, bottomUp[child]);
  34.                     }
  35.                 } else break;
  36.             }
  37.             if (v == bottomUp[i]) break;
  38.             bottomUp[i] = v;
  39.             i += (i&-i);
  40.         }
  41.         // Update right tree
  42.         i = modifiedNode;
  43.         v = value;
  44.         while (i > 0) {
  45.             if (v > topDown[i]) {
  46.                 if (replaced == topDown[i]) {
  47.                     v = Math.min(v, original[i]);
  48.                     for (int r=1 ;; r++) {
  49.                         int x = (i&-i)>>>r;
  50.                         if (x == 0) break;
  51.                         int child = i+x;
  52.                         if (child > n+1) break;
  53.                         v = Math.min(v, topDown[child]);
  54.                     }
  55.                 } else break;
  56.             }
  57.             if (v == topDown[i]) break;
  58.             topDown[i] = v;
  59.             i -= (i&-i);
  60.         }
  61.     }
  62.    
  63.     @Override
  64.     public long getMin(int a, int b) {
  65.         long min = original[a];
  66.         int prev = a;
  67.         int curr = prev + (prev&-prev); // parent right hand side
  68.         while (curr <= b) {
  69.             min = Math.min(min, topDown[prev]); // value from the other tree
  70.             prev = curr;
  71.             curr = prev + (prev&-prev);;
  72.         }
  73.         min = Math.min(min, original[prev]);
  74.         prev = b;
  75.         curr = prev - (prev&-prev); // parent left hand side
  76.         while (curr >= a) {
  77.             min = Math.min(min,bottomUp[prev]); // value from the other tree
  78.             prev = curr;
  79.             curr = prev - (prev&-prev);
  80.         }
  81.         return min;
  82.     }
  83.    
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement