Guest User

Untitled

a guest
Sep 28th, 2021
750
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. struct seg_tree1 {
  2. int n;
  3. vector<int> sum, add;
  4.  
  5. seg_tree1(int _n) {
  6. n = _n;
  7. sum.resize(2*n);
  8. add.resize(2*n);
  9. }
  10.  
  11. void upd(int l, int r, int lx, int rx, int v, int x) {
  12. if (l >= rx || r <= lx) return;
  13. sum[v] += (min(r, rx)-max(l, lx)) * x;
  14.  
  15. if (l >= lx && r <= rx) {
  16. add[v] += x;
  17. return;
  18. }
  19. int m = (l + r) / 2;
  20. upd(l, m, lx, rx, v+1, x);
  21. upd(m, r, lx, rx, v+(m-l)*2, x);
  22. }
  23. void upd(int l, int r, int x) {
  24. upd(0, n, l, r+1, 0, x);
  25. }
  26.  
  27. int ask(int l, int r, int lx, int rx, int v) {
  28. if (l >= rx || r <= lx) return 0;
  29. if (l >= lx && r <= rx) {
  30. return sum[v];
  31. }
  32. int m = (l + r) / 2;
  33. return ask(l, m, lx, rx, v+1) + ask(m, r, lx, rx, v+(m-l)*2) + (min(r, rx)-max(l, lx)) * add[v];
  34. }
  35. int ask(int l, int r) {
  36. return ask(0, n, l, r+1, 0);
  37. }
  38. };
  39.  
  40. struct seg_tree2 {
  41. int n, m;
  42. vector<seg_tree1> sum, add;
  43. seg_tree2(int _n, int _m) {
  44. n = _n; m = _m;
  45. sum.resize(2*n, seg_tree1(m));
  46. add.resize(2*n, seg_tree1(m));
  47. }
  48.  
  49. void upd(int l1, int r1, int lx, int rx, int l2, int r2, int v, int x) {
  50. if (l1 >= rx || r1 <= lx) return;
  51.  
  52. sum[v].upd(l2, r2, x * (min(rx, r1) - max(lx, l1)));
  53. if (l1 >= lx && r1 <= rx) {
  54. add[v].upd(l2, r2, x);
  55. return;
  56. }
  57. int med = (l1 + r1) / 2;
  58. upd(l1, med, lx, rx, l2, r2, v+1, x);
  59. upd(med, r1, lx, rx, l2, r2, v+(med-l1)*2, x);
  60. }
  61.  
  62. int ask(int l1, int r1, int lx, int rx, int l2, int r2, int v) {
  63. if (l1 >= rx || r1 <= lx) return 0;
  64. if (l1 >= lx && r1 <= rx) {
  65. return sum[v].ask(l2, r2);
  66. }
  67. int med = (l1 + r1) / 2;
  68. return ask(l1, med, lx, rx, l2, r2, v+1) + ask(med, r1, lx, rx, l2, r2, v+(med-l1)*2)
  69. + add[v].ask(l2, r2) * (min(rx, r1) - max(lx, l1));
  70. }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment