Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <iterator>
- #include <stack>
- #include <utility>
- #include <queue>
- #include <map>
- #include <set>
- #include <cmath>
- #include <limits.h>
- #include <iomanip>
- #define print(i) cout << i << endl
- #define pb push_back
- #define INF 100000000
- #define mp make_pair
- typedef long long llong;
- typedef unsigned int uint;
- using namespace std;
- struct _data {
- int sum, pref, suff, ans;
- _data() {}
- };
- _data combine(_data l, _data r) {
- _data res;
- res.sum = l.sum + r.sum;
- res.pref = max(l.pref, r.pref);
- res.suff = max(l.suff, r.suff);
- res.ans = max(max(l.ans, r.ans), r.ans + l.ans);
- return res;
- }
- _data make(int val) {
- _data res;
- res.sum = val;
- res.pref = res.suff = res.ans = max(0, val);
- return res;
- }
- vector<_data> tree;
- vector<int> seq;
- void build(int v, int l, int r) {
- if (l + 1 == r) {
- tree[v] = make(seq[l]);
- return;
- }
- int tm = (l + r) / 2;
- build(v * 2 + 1, l, tm);
- build(v * 2 + 2, tm, r);
- tree[v] = combine(tree[v * 2 + 1], tree[v * 2 + 2]);
- }
- void update(int v, int l, int r, int pos, int val) {
- if (pos == l && pos + 1 == r) {
- tree[v] = make(val);
- return;
- }
- if (pos < l || r <= pos) {
- return;
- }
- int tm = (r + l) / 2;
- update(v * 2 + 1, l, tm, pos, val);
- update(v * 2 + 2, tm, r, pos, val);
- tree[v] = combine(tree[v * 2 + 1], tree[v * 2 + 2]);
- }
- _data query(int v, int l, int r, int L, int R) {
- if (L >= l && R < r) {
- return tree[v];
- }
- if (L < l || R >= r) {
- return make(-INF);
- }
- int tm = (r + l) / 2;
- return combine(query(v * 2 + 1, l, tm, L, R), query(v * 2 + 2, tm, r, L, R));
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int n;
- cin >> n;
- seq.resize(n);
- tree.resize(4 * n);
- vector<int> deleted(n);
- for (int i = 0; i < n; i++) {
- cin >> seq[i];
- }
- for (int i = 0; i < n; i++) {
- cin >> deleted[i];
- }
- build(0, 0, n);
- for (int d : deleted) {
- int pos = d - 1;
- int val = -INF;
- update(0, 0, n, pos, val);
- _data ans = query(0, 0, n, 0, n);
- print(ans.ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement