Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <map>
  6. #include <set>
  7. #include <unordered_map>
  8. #include <unordered_set>
  9. #include <stack>
  10. #include <queue>
  11. #include <deque>
  12.  
  13. using namespace std;
  14.  
  15. #define ll long long
  16. #define ld long double
  17. #define mp make_pair
  18. #define pii pair<int, int>
  19. #define ft first
  20. #define sd second
  21. //#define int long long
  22.  
  23. const int MAX_N = 300000;
  24. const ll INF = 1000000000000000000;
  25.  
  26. ll a[MAX_N];
  27. vector<vector<vector<ll>>> ans(MAX_N, vector<vector<ll>>(4, vector<ll>(4)));
  28.  
  29. inline void update(int n, int l, int r) {
  30. int m = (l + r) / 2;
  31. for (int l1 = 0; l1 <= 3; l1++)
  32. for (int r1 = 0; r1 <= 3; r1++)
  33. ans[n][l1][r1] = -INF;
  34. for (int l1 = 0; l1 <= 3; l1++)
  35. for (int r1 = 0; r1 <= 3; r1++)
  36. if (ans[2 * n + 1][l1][r1] >= 0)
  37. for (int l2 = 0; l2 + r1 <= 3; l2++)
  38. for (int r2 = 0; r2 <= 3; r2++)
  39. if (ans[2 * n + 2][l2][r2] >= 0) {
  40. int curl = l1;
  41. if (l1 == m - l)
  42. curl += l2;
  43. int curr = r2;
  44. if (r2 == r - m)
  45. curr += r1;
  46. if (curl <= 3 && curr <= 3)
  47. ans[n][curl][curr] = max(ans[n][curl][curr], ans[2 * n + 1][l1][r1] + ans[2 * n + 2][l2][r2]);
  48. }
  49. }
  50.  
  51. void build(int n, int l, int r) {
  52. if (r - l == 1) {
  53. for (int l1 = 0; l1 <= 3; l1++)
  54. for (int r1 = 0; r1 <= 3; r1++)
  55. ans[n][l1][r1] = -INF;
  56. ans[n][0][0] = 0;
  57. ans[n][1][1] = a[l];
  58. }
  59. else {
  60. int m = (l + r) / 2;
  61. build(2 * n + 1, l, m);
  62. build(2 * n + 2, m, r);
  63. update(n, l, r);
  64. }
  65. }
  66.  
  67.  
  68. void change(int n, int l, int r, int pos, int val) {
  69. if (r - l == 1) {
  70. a[pos] = val;
  71. for (int l = 0; l <= 3; l++)
  72. for (int r = 0; r <= 3; r++)
  73. if (l + r <= 3)
  74. ans[n][l][r] = -INF;
  75. ans[n][0][0] = 0;
  76. ans[n][1][1] = a[l];
  77. }
  78. else {
  79. int m = (l + r) / 2;
  80. if (pos < m)
  81. change(2 * n + 1, l, m, pos, val);
  82. else
  83. change(2 * n + 2, m, r, pos, val);
  84. update(n, l, r);
  85. }
  86. }
  87.  
  88. inline ll genans() {
  89. ll ans1 = 0;
  90. for (int l = 0; l <= 3; l++)
  91. for (int r = 0; l + r <= 3; r++)
  92. ans1 = max(ans1, ans[0][l][r]);
  93. return ans1;
  94. }
  95. int32_t main() {
  96. cin.tie(NULL);
  97. cout.tie(NULL);
  98. ios_base::sync_with_stdio(false);
  99. int n;
  100. cin >> n;
  101. for (int i = 0; i < n; i++)
  102. cin >> a[i];
  103. build(0, 0, n);
  104. cout << genans() << '\n';
  105. int q;
  106. cin >> q;
  107. for (; q > 0; q--) {
  108. int pos, val;
  109. cin >> pos >> val;
  110. change(0, 0, n, pos - 1, val);
  111. cout << genans() << '\n';
  112. }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement