Advertisement
Guest User

2D range add/fetch

a guest
Sep 18th, 2013
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. ll fxy[MAN][MAN]; // coefficient of x*y at [r,c]
  2. ll fx[MAN][MAN];  // coefficient of x   at [r,c]
  3. ll fy[MAN][MAN];  // coefficient of y   at [r,c]
  4. ll fc[MAN][MAN];  // additive           at [r,c]
  5.  
  6. // 2D fenwick tree insert
  7. void insert(ll f[MAN][MAN],ll x,ll y,ll k){
  8.   for (ll i=x; i<MAN; i|=i+1)
  9.     for (ll j=y; j<MAN; j|=j+1)
  10.       f[i][j]+=k;
  11. }
  12.  
  13. // 2D fenwick tree lookup
  14. ll get(ll f[MAN][MAN],ll x,ll y){
  15.   ll res=0;
  16.   for (ll i=x; i>=0; --(i&=i+1))
  17.     for (ll j=y; j>=0; --(j&=j+1))
  18.       res+=f[i][j];
  19.   return res;
  20. }
  21.  
  22. // evaluate functions at (x,y)
  23. ll calc(ll x,ll y){
  24.   return get(fxy, x, y)*x*y
  25.        + get(fx,  x, y)*x
  26.        + get(fy,  x, y)*y
  27.        + get(fc,  x, y);
  28. }
  29.  
  30. // create infinite rectangle with lower-left corner at (a,b)
  31. ll add(ll x,ll y,ll k){
  32.   // area(x,y) => (x+1-a)*(y+1-b)
  33.   //           == x*y+x-b*x + y+1-b + -a*y-a+a*b
  34.   //           == x*y + x*(1-b) + y*(1-a) + 1+a*b-a-b
  35.  
  36.   ll mxy = k;
  37.   ll mx  = k*(1-y);
  38.   ll my  = k*(1-x);
  39.   ll mc  = k*(1+x*y-x-y);
  40.  
  41.   insert(fxy, x,y, mxy);
  42.   insert(fx,  x,y, mx);
  43.   insert(fy,  x,y, my);
  44.   insert(fc,  x,y, mc);
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement