Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define nl "\n"
- #define fi first
- #define se second
- #define pb push_back
- #define ll long long
- #define RV return void
- #define sz(x) int(x.size())
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(), v.rend()
- struct Node{
- int sum , pref , suff , mx;
- Node(){
- sum = mx = pref = suff = 0;
- }
- void change(int x){
- sum = mx = pref = suff = x;
- }
- };
- struct SegTree{
- int tree_size;
- vector<Node> tree;
- SegTree(int n){
- tree_size = 1;
- while (tree_size < n) tree_size *= 2;
- tree.assign(2 * tree_size, Node());
- }
- Node merge(Node &left, Node &right){
- Node ans = Node();
- ans.sum = left.sum + right.sum;
- ans.pref = max(left.pref, left.sum + right.pref);
- ans.suff = max(right.suff, left.suff + right.sum);
- ans.mx = max({left.mx, right.mx, left.suff + right.pref});
- return ans;
- }
- void build(vector<int> & v, int node, int lx, int rx){
- if(rx - lx == 1){
- if(lx < sz(v) )
- tree[node].change(v[lx]);
- return;
- }
- int md = lx + (rx - lx) / 2;
- build(v, 2 * node + 1, lx, md);
- build(v, 2 * node + 2, md, rx);
- tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
- }
- void build(vector<int> & v){
- build(v, 0, 0, tree_size);
- }
- Node get(int l, int r, int node, int lx, int rx){
- if(lx >= l and rx <= r)
- return tree[node];
- if(lx >= r or rx <= l)
- return Node();
- int md = lx + (rx - lx) / 2;
- Node left = get(l, r, 2 * node + 1, lx, md);
- Node right = get(l, r, 2 * node + 2, md, rx);
- return merge(left, right);
- }
- Node get(int l, int r){
- return get(l, r, 0, 0, tree_size);
- }
- };
- void solve(){
- int n; cin >> n;
- vector < int > v(n), nxt(n), prv(n);
- for(auto& x : v) cin >> x;
- stack < int > st;
- for(int i = n - 1; i >= 0; i--){
- while(!st.empty() and v[st.top()] <= v[i]) st.pop();
- nxt[i] = (st.empty() ? n-1 : st.top() - 1);
- st.push(i);
- }
- stack < int > st2;
- for(int i = 0; i < n; i++){
- while(!st2.empty() and v[st2.top()] <= v[i]) st2.pop();
- prv[i] = (st2.empty() ? 0 : st2.top() + 1);
- st2.push(i);
- }
- // for(int i =0 ; i < n ; i++){
- // cout << v[i] << " " << prv[i] << " " << nxt[i] << nl;
- // }
- SegTree seg(n);
- seg.build(v);
- int ans=0;
- for(int i =0 ; i < n ; i++){
- // suppose we must delete v[i]
- int l = prv[i] , r = nxt[i] ;
- auto temp = seg.get(l,r+1);
- if(temp.l <= l and temp.r >= r ){
- // valid
- ans = max(ans, temp.mx - v[i]);
- }
- }
- cout << ans ;
- }
- int main(){
- ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
- int t=1;
- // cin >> t ;
- for(int i=1 ; i <= t ; i++){
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement