Advertisement
lalalalalalalaalalla

Untitled

Dec 15th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <iomanip>
  5. #include <queue>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <tuple>
  9. #include <iomanip>
  10. #include <stdio.h>
  11. #include <numeric>
  12. #include <map>
  13. #include <bitset>
  14. #include <set>
  15. #include <stack>
  16. #include <queue>
  17.  
  18. /*
  19. #pragma GCC optimize("Ofast,no-stack-protector")
  20. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  21. #pragma GCC optimize("unroll-loops")
  22. #pragma GCC optimize("fast-math")
  23. #pragma GCC optimize("section-anchors")
  24. #pragma GCC optimize("profile-values,profile-reorder-functions,tracer")
  25. #pragma GCC optimize("vpt")
  26. #pragma GCC optimize("rename-registers")
  27. #pragma GCC optimize("move-loop-invariants")
  28. #pragma GCC optimize("unswitch-loops")
  29. #pragma GCC optimize("function-sections")
  30. #pragma GCC optimize("data-sections")
  31. #pragma GCC optimize("branch-target-load-optimize")
  32. #pragma GCC optimize("branch-target-load-optimize2")
  33. #pragma GCC optimize("btr-bb-exclusive")
  34. */
  35.  
  36. #define int long long
  37. #define ll long long
  38. #define ull unsigned long long
  39. #define all(a) a.begin(), a.end()
  40. #define pii pair<int, int>
  41. #define pb push_back
  42. #define ld long double
  43.  
  44.  
  45. using namespace std;
  46.  
  47. //const int INF = 1e13;
  48. //const int mod = 2600000069;
  49. //const int p = 179;
  50.  
  51. struct zeroes {
  52. int left, right, ans, size;
  53. zeroes(int ans_, int left_, int right_, int size_) {
  54. ans = ans_;
  55. left = left_;
  56. right = right_;
  57. size = size_;
  58. }
  59. zeroes() {
  60. ans = 0;
  61. left = 0;
  62. right = 0;
  63. size = 0;
  64. }
  65. };
  66.  
  67. zeroes merge(zeroes a, zeroes b) {
  68. zeroes c;
  69. c.size = a.size + b.size;
  70. c.ans = max(a.ans, max(b.ans, a.right + b.left));
  71. c.right = b.right;
  72. c.left = a.left;
  73. if (a.size == a.left && b.size == b.left) {
  74. c.left = c.size;
  75. c.right = c.size;
  76. }
  77. if (a.left == a.size) {
  78. c.left = a.size + b.left;
  79. }
  80. if (b.right == b.size) {
  81. c.right = b.size + a.right;
  82. }
  83. c.ans = max(c.ans, max(c.left, c.right));
  84. return c;
  85. }
  86.  
  87. vector<zeroes> t;
  88. vector<int> a;
  89.  
  90. void build(int v, int l, int r) {
  91. if (r - l == 1) {
  92. if (a[l] == 0) {
  93. t[v] = zeroes(1, 1, 1, 1);
  94. } else {
  95. t[v] = zeroes(0, 0, 0, 1);
  96. }
  97. return;
  98. }
  99. int mid = (l + r) / 2;
  100. build(2 * v + 1, l, mid);
  101. build(2 * v + 2, mid, r);
  102. t[v] = merge(t[2 * v + 1], t[2 * v + 2]);
  103. }
  104.  
  105. zeroes get_ans(int v, int l, int r, int askl, int askr) {
  106. if (l >= askr || r <= askl) {
  107. return zeroes();
  108. }
  109. if (l >= askl && r <= askr) {
  110. return t[v];
  111. }
  112. int mid = (l + r) / 2;
  113. return merge(get_ans(2 * v + 1, l, mid, askl, askr), get_ans(2 * v + 2, mid, r, askl, askr));
  114. }
  115.  
  116. void update(int v, int l, int r, int pos, int val) {
  117. if (r - l == 1) {
  118. if (val == 0) {
  119. t[v] = zeroes(1, 1, 1, 1);
  120. } else {
  121. t[v] = zeroes(0, 0, 0, 1);
  122. }
  123. return;
  124. }
  125. int mid = (l + r) / 2;
  126. if (pos < mid) {
  127. update(2 * v + 1, l, mid, pos, val);
  128. } else {
  129. update(2 * v + 2, mid, r, pos, val);
  130. }
  131. t[v] = merge(t[2 * v + 1], t[2 * v + 2]);
  132. }
  133.  
  134. signed main() {
  135. ios_base::sync_with_stdio(0);
  136. cin.tie(0);
  137. cout.tie(0);
  138. int n;
  139. cin >> n;
  140. t.resize(4 * n);
  141. a.resize(n);
  142. for (int i = 0; i < n; i++) cin >> a[i];
  143. build(0, 0, n);
  144. int q;
  145. cin >> q;
  146. string type;
  147. int l, r;
  148. while (q--) {
  149. cin >> type >> l >> r;
  150. --l;
  151. if (type == "QUERY") {
  152. cout << get_ans(0, 0, n, l, r).ans << "\n";
  153. } else {
  154. update(0, 0, n, l, r);
  155. }
  156. }
  157. }
  158. /*
  159. 5
  160. 328 0 0 0 0
  161. 5
  162. QUERY 1 3
  163. UPDATE 2 832
  164. QUERY 3 3
  165. QUERY 2 3
  166. UPDATE 2 0
  167. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement