UVa 10534 - Wavio Sequence
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e5+5;
const int MAXM=1e5+5;
const int mod=1e9+7;
int n,x[MAXN],f[MAXN],g[MAXN][2];
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
int len;
f[0]=len=0;
for(int i=1;i<=n;i++){
int l=1,r=len,mid,pos=0;
while(l<=r){
mid=(l+r)/2;
if (f[mid]<x[i]) pos=mid,l=mid+1;
else r=mid-1;
}
f[pos+1]=x[i];
g[i][0]=pos+1;
len=max(len,pos+1);
}
f[0]=len=0;
for(int i=n;i>=1;i--){
int l=1,r=len,mid,pos=0;
while(l<=r){
mid=(l+r)/2;
if (f[mid]<x[i]) pos=mid,l=mid+1;
else r=mid-1;
}
f[pos+1]=x[i];
g[i][1]=pos+1;
len=max(len,pos+1);
}
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,min(g[i][0],g[i][1]));
printf("%d\n",ans*2-1);
}
return 0;
}