Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
92
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 <string>
  4. #include <algorithm>
  5. #include <iterator>
  6. #include <stack>
  7. #include <utility>
  8. #include <queue>
  9. #include <map>
  10. #include <set>
  11. #include <cmath>
  12. #include <limits.h>
  13. #include <iomanip>
  14.  
  15. #define print(i) cout << i << endl
  16. #define pb push_back
  17. #define INF 100000000
  18. #define mp make_pair
  19.  
  20.  
  21. typedef long long llong;
  22. typedef unsigned int uint;
  23.  
  24. using namespace std;
  25.  
  26. struct _data {
  27. int sum, pref, suff, ans;
  28.  
  29. _data() {}
  30. };
  31.  
  32. _data combine(_data l, _data r) {
  33. _data res;
  34. res.sum = l.sum + r.sum;
  35. res.pref = max(l.pref, r.pref);
  36. res.suff = max(l.suff, r.suff);
  37. res.ans = max(max(l.ans, r.ans), r.ans + l.ans);
  38. return res;
  39. }
  40.  
  41. _data make(int val) {
  42. _data res;
  43. res.sum = val;
  44. res.pref = res.suff = res.ans = max(0, val);
  45. return res;
  46. }
  47.  
  48. vector<_data> tree;
  49. vector<int> seq;
  50.  
  51. void build(int v, int l, int r) {
  52. if (l + 1 == r) {
  53. tree[v] = make(seq[l]);
  54. return;
  55. }
  56. int tm = (l + r) / 2;
  57. build(v * 2 + 1, l, tm);
  58. build(v * 2 + 2, tm, r);
  59. tree[v] = combine(tree[v * 2 + 1], tree[v * 2 + 2]);
  60. }
  61.  
  62. void update(int v, int l, int r, int pos, int val) {
  63. if (pos == l && pos + 1 == r) {
  64. tree[v] = make(val);
  65. return;
  66. }
  67. if (pos < l || r <= pos) {
  68. return;
  69. }
  70. int tm = (r + l) / 2;
  71. update(v * 2 + 1, l, tm, pos, val);
  72. update(v * 2 + 2, tm, r, pos, val);
  73. tree[v] = combine(tree[v * 2 + 1], tree[v * 2 + 2]);
  74. }
  75.  
  76. _data query(int v, int l, int r, int L, int R) {
  77. if (L >= l && R < r) {
  78. return tree[v];
  79. }
  80.  
  81. if (L < l || R >= r) {
  82. return make(-INF);
  83. }
  84.  
  85. int tm = (r + l) / 2;
  86. return combine(query(v * 2 + 1, l, tm, L, R), query(v * 2 + 2, tm, r, L, R));
  87. }
  88.  
  89. int main()
  90. {
  91. ios_base::sync_with_stdio(false);
  92. cin.tie(NULL);
  93. cout.tie(NULL);
  94. int n;
  95. cin >> n;
  96. seq.resize(n);
  97. tree.resize(4 * n);
  98. vector<int> deleted(n);
  99. for (int i = 0; i < n; i++) {
  100. cin >> seq[i];
  101. }
  102. for (int i = 0; i < n; i++) {
  103. cin >> deleted[i];
  104. }
  105. build(0, 0, n);
  106. for (int d : deleted) {
  107. int pos = d - 1;
  108. int val = -INF;
  109. update(0, 0, n, pos, val);
  110. _data ans = query(0, 0, n, 0, n);
  111. print(ans.ans);
  112. }
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement