Advertisement
supremeXD

Double segment tree

Dec 8th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. // #define _CRT_SECURE_NO_WARNINGS
  2. // ░░░░░░░▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄░░░░░░
  3. // ░░░░░░█░░▄▀▀▀▀▀▀▀▀▀▀▀▀▀▄░░█░░░░░
  4. // ░░░░░░█░█░▀░░░░░▀░░▀░░░░█░█░░░░░
  5. // ░░░░░░█░█░░░░░░░░▄▀▀▄░▀░█░█▄▀▀▄░
  6. // █▀▀█▄░█░█░░▀░░░░░█░░░▀▄▄█▄▀░░░█░
  7. // ▀▄▄░▀██░█▄░▀░░░▄▄▀░░░░░░░░░░░░▀▄
  8. // ░░▀█▄▄█░█░░░░▄░░█░░░▄█░░░▄░▄█░░█
  9. // ░░░░░▀█░▀▄▀░░░░░█░██░▄░░▄░░▄░███
  10. // ░░░░░▄█▄░░▀▀▀▀▀▀▀▀▄░░▀▀▀▀▀▀▀░▄▀░
  11. // ░░░░█░░▄█▀█▀▀█▀▀▀▀▀▀█▀▀█▀█▀▀█░░░
  12. // ░░░░▀▀▀▀░░▀▀▀░░░░░░░░▀▀▀░░▀▀░░░░
  13. #include <algorithm>
  14. #include <array>
  15. #include <bitset>
  16. #include <chrono>
  17. #include <cmath>
  18. #include <cstdio>
  19. #include <cstring>
  20. #include <ctime>
  21. #include <deque>
  22. #include <fstream>
  23. #include <iostream>
  24. #include <map>
  25. #include <numeric>
  26. #include <queue>
  27. #include <random>
  28. #include <set>
  29. #include <stack>
  30. #include <string>
  31. #include <unordered_map>
  32. #include <unordered_set>
  33. #include <vector>
  34. //#pragma GCC optimize("Ofast,inline,unroll-loops,no-stack-protector,O2")
  35. //#pragma GCC target("avx,avx2,fma")
  36. using namespace std;
  37. #define rep(i, a, n) for (int i = a; i < n; i++)
  38. #define per(i, a, n) for (int i = n - 1; i >= a; i--)
  39. #define all(v) v.begin(), v.end()
  40. //#define sz(v) ((int)(v).size())
  41. #define trav(a, x) for (auto& a: x)
  42. typedef long long ll;
  43. typedef unsigned long long ull;
  44. typedef vector<int> vi;
  45. typedef vector<ll> vll;
  46. const int INF = 1e9;
  47. const int MOD = 1e9 + 9;
  48. const int di[4] = { 1, 0, -1, 0 };
  49. const int dj[4] = { 0, 1 ,0, -1 };
  50. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  51.  
  52. // сумма и точечные изменения
  53.  
  54. int n;
  55. int a[100][100];
  56. int t[400][400];
  57.  
  58. void build2(int v_big, int v, int l_big, int l, int r) {
  59. if (r - l == 1) {
  60. t[v_big][v] = a[l_big][l];
  61. return;
  62. }
  63. int m = (l + r) / 2;
  64. build2(v_big, 2 * v + 1, l_big, l, m);
  65. build2(v_big, 2 * v + 2, l_big, m, r);
  66. t[v_big][v] = t[v_big][2 * v + 1] + t[v_big][2 * v + 2];
  67. }
  68.  
  69. void build1(int v, int l, int r) {
  70. if (r - l == 1) {
  71. build2(v, 0, l, 0, n);
  72. return;
  73. }
  74. int m = (l + r) / 2;
  75. build1(2 * v + 1, l, m);
  76. build1(2 * v + 2, m, r);
  77. for (int ni = 0; ni < 4*n; ni++) {
  78. t[v][ni] = t[2 * v + 1][ni] + t[2 * v + 2][ni];
  79. }
  80. }
  81.  
  82. int asksum2(int v_big, int v, int l, int r, int askl, int askr) {
  83. if (l >= askr || r <= askl) {
  84. return 0;
  85. }
  86. if (l >= askl && r <= askr) {
  87. return t[v_big][v];
  88. }
  89. int m = (l + r) / 2;
  90. return asksum2(v_big, 2 * v + 1, l, m, askl, askr) + asksum2(v_big, 2 * v + 2, m, r, askl, askr);
  91. }
  92.  
  93. int asksum1(int v, int l, int r, int aski1, int askj1, int aski2, int askj2) {
  94. if (l >= aski2 || r <= aski1) {
  95. return 0;
  96. }
  97. if (l >= aski1 && r <= aski2) {
  98. return asksum2(v, 0, 0, n, askj1, askj2);
  99. }
  100. int m = (l + r) / 2;
  101. return asksum1(2 * v + 1, l, m, aski1, askj1, aski2, askj2) + asksum1(2 * v + 2, m, r, aski1, askj1, aski2, askj2);
  102. }
  103.  
  104. void change2(int v_big, int v, int l, int r, int pos, int val) {
  105. if (r - l == 1) {
  106. t[v_big][v] = val;
  107. return;
  108. }
  109. int m = (l + r) / 2;
  110. if (pos < m) {
  111. change2(v_big, 2 * v + 1, l, m, pos, val);
  112. }
  113. else {
  114. change2(v_big, 2 * v + 2, m, r, pos, val);
  115. }
  116. t[v_big][v] = t[v_big][2 * v + 1] + t[v_big][2 * v + 2];
  117. }
  118.  
  119. void change1(int v, int l, int r, int pos_i, int pos_j, int val) {
  120. if (r - l == 1) {
  121. change2(v, 0, 0, n, pos_j, val);
  122. return;
  123. }
  124. int m = (l + r) / 2;
  125. if (pos_i < m) {
  126. change1(2 * v + 1, l, m, pos_i, pos_j, val);
  127. }
  128. else {
  129. change1(2 * v + 2, m, r, pos_i, pos_j, val);
  130. }
  131. for (int ni = 0; ni < 4 * n; ni++) {
  132. t[v][ni] = t[2 * v + 1][ni] + t[2 * v + 2][ni];
  133. }
  134. }
  135.  
  136. int main() {
  137. ios_base::sync_with_stdio(0);
  138. cin.tie(0);
  139. cout.tie(0);
  140. cin >> n;
  141. rep(i, 0, n) {
  142. rep(j, 0, n) {
  143. cin >> a[i][j];
  144. }
  145. }
  146. build1(0, 0, n);
  147. int m;
  148. cin >> m;
  149. rep(i, 0, m) {
  150. char s;
  151. cin >> s;
  152. if (s == 'c') {
  153. int pos_i, pos_j, val;
  154. cin >> pos_i >> pos_j >> val;
  155. change1(0, 0, n, pos_i, pos_j, val);
  156. }
  157. else {
  158. int i1, j1, i2, j2;
  159. cin >> i1 >> j1 >> i2 >> j2;
  160. int ans = asksum1(0, 0, n, i1, j1, i2 + 1, j2 + 1);
  161. cout << ans << "\n";
  162. }
  163. }
  164. }
  165.  
  166. /*
  167. 7
  168. 1 4 2 5 3 0 7
  169. -4 2 1 11 8 2 9
  170. 12 26 7 1 1 0 1
  171. 10 7 6 2 1 2 3
  172. 13 -1 -4 -6 7 -7 2
  173. 4 2 1 2 6 0 3
  174. 4 1 4 8 4 1 2
  175. */
  176.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement