Untitled

 avatar
unknown
c_cpp
6 months ago
1.6 kB
5
Indexable
#include <bits/stdc++.h>

using namespace std;

#define int long long

struct SegTree{
    int op(int a,int b){
        return max(a , b);
    }
    vector<int> T;
    int n;
    SegTree(int _n){
        n = _n;
        T.resize(2 * n);
    }
    void build(vector<int> &a){
        for(int i = 0; i < n; i++){
            update(i , a[i]);
        }
    }
    void update(int pos,int val){
        for(T[pos += n] = val; pos ; pos>>=1){
            T[pos >> 1] = op(T[pos],T[pos ^ 1]);
        }
    }
    int query(int l,int r){
        int ans = 0;
        for(l += n, r += n+1; l<r; l >>= 1, r >>= 1){
            if(l%2){
                ans = op(ans, T[l++]);
            }
            if(r%2){
                ans = op(ans, T[--r]);
            }
        }
        return ans;
    }
};

void solve() {
  int n;
  cin >> n;
  vector<int> a(n);
  for(int i = 0; i < n; i++) {
    cin >> a[i];
  }
  vector<int> pref(n), suff(n);
  pref[0] = 1;
  suff[n - 1] = 1;
  for(int i = 1; i < n; i++) {
    if(a[i - 1] <a[i]) {
      pref[i] = pref[i - 1] + 1;
    } else {
      pref[i] = 1;
    }
  }
  SegTree st(n + 10);
  for(int i = n - 2; i >= 0; i--) {
    if(a[i] < a[i + 1]) {
      suff[i] = suff[i + 1] + 1;
    } else {
      suff[i] = 1;
    }
    st.update(a[i], suff[i]);
  }
  int ans = 1;
  for(int i = 0; i < n; i++) {
     ans = max(ans, pref[i] + st.query(a[i] + 1, n));
     st.update(a[i], 0);
  }
  cout << ans << '\n';
}

int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int tt = 1;
  // cin >> tt;
  while(tt--) solve();
}
Editor is loading...
Leave a Comment