konchin_shih

2d-segtree

Oct 17th, 2022
781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. constexpr int maxn=1e3+5;
  2. int arr[(maxn+1)<<2][(maxn+1)<<2];
  3.  
  4. #define xm ((xl+xr)>>1)
  5. #define ym ((yl+yr)>>1)
  6. void _build(auto& v,int xi,int xl,int xr,int yi=1,int yl=0,int yr=maxn){
  7.     if(yr-yl==1){
  8.         if(xr-xl==1){
  9.             if(xl<int(v.size())&&yl<int(v.size()))
  10.                 arr[xi][yi]=v[xl][yl];
  11.         }else
  12.             arr[xi][yi]=arr[xi<<1][yi]+arr[xi<<1|1][yi];
  13.         return;
  14.     }
  15.     _build(v,xi,xl,xr,yi<<1,yl,ym),_build(v,xi,xl,xr,yi<<1|1,ym,yr);
  16.     arr[xi][yi]=arr[xi][yi<<1]+arr[xi][yi<<1|1];
  17. }
  18. void build(auto& v,int xi=1,int xl=0,int xr=maxn){
  19.     if(xr-xl>1)
  20.         build(v,xi<<1,xl,xm),build(v,xi<<1|1,xm,xr);
  21.     _build(v,xi,xl,xr);
  22. }
  23. int _query(int yql,int yqr,int xi,int yi=1,int yl=0,int yr=maxn){
  24.     if(yqr<=yl||yr<=yql) return 0;
  25.     // debug(yl,yr);
  26.     if(yql<=yl&&yr<=yqr) return arr[xi][yi];
  27.     return _query(yql,yqr,xi,yi<<1,yl,ym)+_query(yql,yqr,xi,yi<<1|1,ym,yr);
  28. }
  29. int query(int xql,int xqr,int yql,int yqr,int xi=1,int xl=0,int xr=maxn){
  30.     if(xqr<=xl||xr<=xql) return 0;
  31.     // debug(xl,xr);
  32.     if(xql<=xl&&xr<=xqr) return _query(yql,yqr,xi);
  33.     return query(xql,xqr,yql,yqr,xi<<1,xl,xm)+query(xql,xqr,yql,yqr,xi<<1|1,xm,xr);
  34. }
  35. void _update(int yp,int xi,int xl,int xr,int yi=1,int yl=0,int yr=maxn){
  36.     if(yp<yl||yr<=yp) return;
  37.     if(yr-yl==1){
  38.         if(xr-xl==1)
  39.             arr[xi][yi]^=1;
  40.         else
  41.             arr[xi][yi]=arr[xi<<1][yi]+arr[xi<<1|1][yi];
  42.         return;
  43.     }
  44.     _update(yp,xi,xl,xr,yi<<1,yl,ym),_update(yp,xi,xl,xr,yi<<1|1,ym,yr);
  45.     arr[xi][yi]=arr[xi][yi<<1]+arr[xi][yi<<1|1];
  46. }
  47. void update(int xp,int yp,int xi=1,int xl=0,int xr=maxn){
  48.     if(xp<xl||xr<=xp) return;
  49.     if(xr-xl>1)
  50.         update(xp,yp,xi<<1,xl,xm),update(xp,yp,xi<<1|1,xm,xr);
  51.     _update(yp,xi,xl,xr);
  52. }
  53. void _print(auto& v,int xl,int xi,int yi=1,int yl=0,int yr=maxn){
  54.     if(yr-yl==1){if(yl<int(v.size())) debug(xl,yl,arr[xi][yi]);return;}
  55.     _print(v,xl,xi,yi<<1,yl,ym),_print(v,xl,xi,yi<<1|1,ym,yr);
  56. }
  57. void print(auto& v,int xi=1,int xl=0,int xr=maxn){
  58.     if(xr-xl>1)
  59.         print(v,xi<<1,xl,xm),print(v,xi<<1|1,xm,xr);
  60.     else
  61.         if(xl<int(v.size())) _print(v,xl,xi);
  62. }
  63. #undef xm
  64. #undef ym
Advertisement
Add Comment
Please, Sign In to add comment