GerONSo

2 ЛКШ

Apr 10th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.95 KB | None | 0 0
  1. // #define pragma
  2.  
  3. #ifdef pragma
  4. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
  5. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6. #endif // pragma
  7.  
  8. #include<bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11.  
  12. #define ll long long
  13. #define all(x) begin(x), end(x)
  14. #define pb push_back
  15. #define x first
  16. #define y second
  17. #define int long long
  18. #define zero(two) memset(two, 0, sizeof(two))
  19.  
  20. using namespace std;
  21. using namespace __gnu_pbds;
  22.  
  23.  
  24. typedef vector<int> vi;
  25. typedef vector<bool> vb;
  26. typedef pair<int, int> pii;
  27. typedef long double ld;
  28. typedef vector<vi> matrix;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. // cout << fixed << setprecision(10);
  39. #if 0
  40. freopen("input", "r", stdin);
  41. freopen("output", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 2e3 + 10;
  46. const int INF = 1e15 + 7;
  47. const int MAXLOG = 31;
  48. const int MOD = 998244353;
  49. const int BASE = 47;
  50.  
  51. struct node {
  52. int mn, ind;
  53. };
  54.  
  55. vector<int> t;
  56. vector<node> t2;
  57. vector<pii> a;
  58.  
  59. int dist(pii a, pii b) {
  60. return abs(a.x - b.x) + abs(a.y - b.y);
  61. }
  62.  
  63. void build(int v, int tl, int tr) {
  64. if(tl == tr) {
  65. t[v] = dist(a[tl], a[tl + 1]);
  66. return;
  67. }
  68. int tm = (tl + tr) >> 1;
  69. build(v * 2 + 1, tl, tm);
  70. build(v * 2 + 2, tm + 1, tr);
  71. t[v] = t[v * 2 + 1] + t[v * 2 + 2];
  72. }
  73.  
  74. void build2(int v, int tl, int tr) {
  75. if(tl == tr) {
  76. t2[v] = {-dist(a[tl - 1], a[tl]) - dist(a[tl], a[tl + 1]) + dist(a[tl - 1], a[tl + 1]), tl};
  77. return;
  78. }
  79. int tm = (tl + tr) >> 1;
  80. build2(v * 2 + 1, tl, tm);
  81. build2(v * 2 + 2, tm + 1, tr);
  82. if(t2[v * 2 + 1].mn < t2[v * 2 + 2].mn) {
  83. t2[v] = t2[v * 2 + 1];
  84. }
  85. else {
  86. t2[v] = t2[v * 2 + 2];
  87. }
  88. }
  89.  
  90. int get_sum(int v, int tl, int tr, int l, int r) {
  91. if(tl > r || tr < l) {
  92. return 0;
  93. }
  94. if(tl >= l && tr <= r) {
  95. return t[v];
  96. }
  97. int tm = (tl + tr) >> 1;
  98. int left = get_sum(v * 2 + 1, tl, tm, l, r);
  99. int right = get_sum(v * 2 + 2, tm + 1, tr, l, r);
  100. return left + right;
  101. }
  102.  
  103. node get_min(int v, int tl, int tr, int l, int r) {
  104. if(tl > r || tr < l) {
  105. return {INF, -1};
  106. }
  107. if(tl >= l && tr <= r) {
  108. return t2[v];
  109. }
  110. int tm = (tl + tr) >> 1;
  111. node left = get_min(v * 2 + 1, tl, tm, l, r);
  112. node right = get_min(v * 2 + 2, tm + 1, tr, l, r);
  113. if(left.mn < right.mn) {
  114. return left;
  115. }
  116. else {
  117. return right;
  118. }
  119. }
  120.  
  121. void update(int v, int tl, int tr, int pos) {
  122. if(tl > pos || tr < pos) {
  123. return;
  124. }
  125. if(tl == tr) {
  126. t[v] = dist(a[tl], a[tl + 1]);
  127. return;
  128. }
  129. int tm = (tl + tr) >> 1;
  130. update(v * 2 + 1, tl, tm, pos);
  131. update(v * 2 + 2, tm + 1, tr, pos);
  132. t[v] = t[v * 2 + 1] + t[v * 2 + 2];
  133. }
  134.  
  135. void update2(int v, int tl, int tr, int pos) {
  136. if(tl > pos || tr < pos) {
  137. return;
  138. }
  139. if(tl == tr) {
  140. t2[v].mn = -dist(a[tl - 1], a[tl]) - dist(a[tl], a[tl + 1]) + dist(a[tl - 1], a[tl + 1]);
  141. return;
  142. }
  143. int tm = (tl + tr) >> 1;
  144. update2(v * 2 + 1, tl, tm, pos);
  145. update2(v * 2 + 2, tm + 1, tr, pos);
  146. if(t2[v * 2 + 1].mn < t2[v * 2 + 2].mn) {
  147. t2[v] = t2[v * 2 + 1];
  148. }
  149. else {
  150. t2[v] = t2[v * 2 + 2];
  151. }
  152. }
  153.  
  154. signed main() {
  155. seriy();
  156. int n, q;
  157. cin >> n >> q;
  158. a.resize(n);
  159. t.resize(4 * n);
  160. t2.resize(4 * n);
  161. for(int i = 0; i < n; i++) {
  162. cin >> a[i].x >> a[i].y;
  163. }
  164. build(0, 0, n - 2);
  165. build2(0, 1, n - 2);
  166. while(q--) {
  167. char t;
  168. cin >> t;
  169. if(t == 'Q') {
  170. int x, y;
  171. cin >> x >> y;
  172. x--;
  173. y--;
  174. if(x == y) {
  175. cout << 0 << '\n';
  176. continue;
  177. }
  178. int mn = 0;
  179. if(x + 1 <= y - 1) mn = get_min(0, 1, n - 2, x + 1, y - 1).mn;
  180. int ans = get_sum(0, 0, n - 2, x, y - 1) + min(mn, 0ll);
  181. cout << ans << '\n';
  182. }
  183. else {
  184. int pos, x, y;
  185. cin >> pos >> x >> y;
  186. pos--;
  187. a[pos] = {x, y};
  188. if(pos > 0 && pos < n - 1) {
  189. update2(0, 1, n - 2, pos);
  190. }
  191. if(pos < n - 1) {
  192. update(0, 0, n - 2, pos);
  193. }
  194. if(pos - 1 > 0 && pos - 1 < n - 1) {
  195. update2(0, 1, n - 2, pos - 1);
  196. }
  197. if(pos >= 0 && pos - 1 < n - 1) {
  198. update(0, 0, n - 2, pos - 1);
  199. }
  200. if(pos + 1 > 0 && pos + 1 < n - 1) {
  201. update2(0, 1, n - 2, pos + 1);
  202. }
  203. }
  204. }
  205. return 0;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment