Advertisement
Guest User

8

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