Advertisement
Zeinab_Hamdy

Untitled

Dec 26th, 2024 (edited)
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define fi first
  5. #define se second
  6. #define pb push_back
  7. #define ll long long
  8. #define RV return void
  9. #define sz(x) int(x.size())
  10. #define all(v) v.begin(), v.end()
  11. #define rall(v) v.rbegin(), v.rend()
  12.  
  13.  
  14. struct Node{
  15.     int sum , pref , suff , mx;
  16.  
  17.     Node(){
  18.         sum  = mx = pref = suff = 0;
  19.     }
  20.     void change(int x){
  21.         sum = mx = pref = suff = x;
  22.     }
  23. };
  24.  
  25. struct SegTree{
  26.     int tree_size;
  27.     vector<Node> tree;
  28.  
  29.     SegTree(int n){
  30.         tree_size = 1;
  31.         while (tree_size < n) tree_size *= 2;
  32.         tree.assign(2 * tree_size, Node());
  33.     }
  34.  
  35.     Node merge(Node &left, Node &right){
  36.         Node ans = Node();
  37.         ans.sum = left.sum + right.sum;
  38.         ans.pref = max(left.pref, left.sum + right.pref);
  39.         ans.suff = max(right.suff, left.suff + right.sum);
  40.         ans.mx = max({left.mx, right.mx, left.suff + right.pref});
  41.         return ans;
  42.     }
  43.  
  44.     void build(vector<int> & v, int node, int lx, int rx){
  45.         if(rx - lx == 1){
  46.             if(lx < sz(v) )
  47.                 tree[node].change(v[lx]);
  48.             return;
  49.         }
  50.         int md = lx + (rx - lx) / 2;
  51.  
  52.         build(v, 2 * node + 1, lx, md);
  53.         build(v, 2 * node + 2, md, rx);
  54.  
  55.         tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
  56.     }
  57.  
  58.     void build(vector<int> & v){
  59.         build(v, 0, 0, tree_size);
  60.     }
  61.  
  62.     Node get(int l, int r, int node, int lx, int rx){
  63.         if(lx >= l and rx <= r)
  64.             return tree[node];
  65.         if(lx >= r or rx <= l)
  66.             return Node();
  67.  
  68.         int md = lx + (rx - lx) / 2;
  69.  
  70.         Node left = get(l, r, 2 * node + 1, lx, md);
  71.         Node right = get(l, r, 2 * node + 2, md, rx);
  72.  
  73.         return merge(left, right);
  74.     }
  75.  
  76.     Node get(int l, int r){
  77.         return get(l, r, 0, 0, tree_size);
  78.     }
  79. };
  80.  
  81.  
  82. void solve(){
  83.  
  84.     int n; cin >> n;
  85.     vector < int > v(n), nxt(n), prv(n);
  86.     for(auto& x : v) cin >> x;
  87.  
  88.     stack < int > st;
  89.     for(int i = n - 1; i >= 0; i--){
  90.         while(!st.empty() and v[st.top()] <= v[i]) st.pop();
  91.         nxt[i] = (st.empty() ? n-1 : st.top() - 1);
  92.         st.push(i);
  93.     }
  94.  
  95.     stack < int > st2;
  96.     for(int i = 0; i < n; i++){
  97.         while(!st2.empty() and v[st2.top()] <= v[i]) st2.pop();
  98.         prv[i] = (st2.empty() ? 0 : st2.top() + 1);
  99.         st2.push(i);
  100.     }
  101.  
  102.     // for(int i =0 ; i < n ; i++){
  103.     //     cout << v[i] <<  " " << prv[i] << " " << nxt[i] << nl;
  104.     // }
  105.  
  106.     SegTree seg(n);
  107.     seg.build(v);
  108.  
  109.     int ans=0;
  110.     for(int i =0 ; i < n ; i++){
  111.         //  suppose we must delete v[i]
  112.         int l = prv[i] , r = nxt[i] ;
  113.         auto temp = seg.get(l,r+1);
  114.  
  115.         if(temp.l <= l and temp.r >= r ){
  116.             //  valid
  117.             ans = max(ans, temp.mx - v[i]);
  118.         }
  119.     }
  120.  
  121.     cout << ans ;
  122.  
  123.  
  124.  
  125.  
  126.    
  127. }
  128.  
  129.  
  130. int main(){
  131.     ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);  
  132.     int t=1;
  133.         // cin >> t ;
  134.     for(int i=1 ; i <= t ; i++){
  135.         solve();
  136.     }
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement