Untitled
unknown
c_cpp
a year ago
1.6 kB
10
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