Guest User

Untitled

a guest
Aug 6th, 2014
398
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.55 KB | None | 0 0
  1. import java.util.Arrays;
  2. import static java.lang.Math.*;
  3.  
  4. public class AddSegmentTree {
  5.     int n;
  6.     int[] treeSum;
  7.     int[] treeMax;
  8.     int[] add;
  9.     int[] len;
  10.     boolean[] pushed;
  11.    
  12.     public AddSegmentTree(int[] arr) {
  13.         n = arr.length;
  14.         treeSum = new int[4*n + 1];
  15.         treeMax = new int[4*n + 1];
  16.         add = new int[4*n + 1];
  17.         len = new int[4*n + 1];
  18.         pushed = new boolean[4*n + 1];
  19.         Arrays.fill(pushed, true);
  20.         build(1, 0, n-1, arr);
  21.     }
  22.  
  23.     private void build(int v, int L, int R, int[] arr) {
  24.         len[v] = R - L + 1;
  25.         if (L == R) {
  26.             treeSum[v] = arr[L];
  27.             treeMax[v] = arr[L];
  28.             return;
  29.         }
  30.         int m = (L + R) >> 1;
  31.         build(2*v, L, m, arr);
  32.         build(2*v+1, m+1, R, arr);
  33.         update(v);
  34.     }
  35.  
  36.     private void update(int v) {
  37.         treeSum[v] = treeSum[2*v] + add[2*v]*len[2*v] +
  38.                      treeSum[2*v+1] + add[2*v+1]*len[2*v+1];
  39.         treeMax[v] = max(treeMax[2*v] + add[2*v],
  40.                          treeMax[2*v+1] + add[2*v+1]);
  41.         add[v] = 0;
  42.     }
  43.  
  44.     private void push(int v) {
  45.         if (pushed[v]) return;
  46.         pushed[v] = true;
  47.         int delta = add[v];
  48.         add[v] = 0;
  49.         treeSum[v] += delta*len[v];
  50.         treeMax[v] += delta;
  51.         if (len[v] == 1) return;
  52.         add[2*v] += delta;
  53.         add[2*v+1] += delta;
  54.         pushed[2*v] = pushed[2*v+1] = false;
  55.     }
  56.    
  57.     public void inc(int v, int L, int R, int needL, int needR, int delta) {
  58.         if (L == needL && R == needR) {
  59.             add[v] += delta;
  60.             pushed[v] = false;
  61.             return;
  62.         }
  63.         push(v);
  64.         int m = (L + R) >> 1;
  65.         if (needR <= m) {
  66.             inc(2*v, L, m, needL, needR, delta);
  67.         } else if (m+1 <= needL) {
  68.             inc(2*v+1, m+1, R, needL, needR, delta);
  69.         } else {
  70.             inc(2*v, L, m, needL, m, delta);
  71.             inc(2*v+1, m+1, R, m+1, needR, delta);
  72.         }
  73.         update(v);
  74.     }
  75.    
  76.     public int getSum(int v, int L, int R, int needL, int needR) {
  77.         if (L == needL && R == needR) {
  78.             return treeSum[v] + add[v]*len[v];
  79.         }
  80.         push(v);
  81.         int m = (L + R) >> 1;
  82.         if (needR <= m) {
  83.             return getSum(2*v, L, m, needL, needR);
  84.         } else if (m+1 <= needL) {
  85.             return getSum(2*v+1, m+1, R, needL, needR);
  86.         } else {
  87.             int a = getSum(2*v, L, m, needL, m);
  88.             int b = getSum(2*v+1, m+1, R, m+1, needR);
  89.             return a + b;
  90.         }
  91.     }
  92.    
  93.     public int getMax(int v, int L, int R, int needL, int needR) {
  94.         if (L == needL && R == needR) {
  95.             return treeMax[v] + add[v];
  96.         }
  97.         push(v);
  98.         int m = (L + R) >> 1;
  99.         if (needR <= m) {
  100.             return getMax(2*v, L, m, needL, needR);
  101.         } else if (m+1 <= needL) {
  102.             return getMax(2*v+1, m+1, R, needL, needR);
  103.         } else {
  104.             int a = getMax(2*v, L, m, needL, m);
  105.             int b = getMax(2*v+1, m+1, R, m+1, needR);
  106.             return max(a, b);
  107.         }
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment