Pagini recente » Cod sursa (job #845858) | Aparitii in presa preONI 2007 | Cod sursa (job #116817) | Cod sursa (job #1389724) | Cod sursa (job #2672920)
//#include <iostream>
#include <fstream>
using namespace std;
typedef long long ll;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const ll NMAX=100009;
ll a[NMAX],r[NMAX],n,ans,t[NMAX],k;
void afis(ll i){
if(r[i]>0) afis(r[i]);
cout<<a[i]<<" ";
}
int binary_search(ll t[],ll a[],ll r,ll f){
int l=1,mid,k=r;
while(r>=l){
mid=(l+r)/2;
if(mid <k && a[t[mid]]<f && f<=a[t[mid+1]])
return mid+1;
else if(a[mid]<f)
l=mid+1;
else
r=mid-1;
}
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
k=1;
t[k]=1;
for(int i=2;i<=n;i++){
if(a[i]>a[t[k]]){
t[++k]=i;
r[t[k]]=t[k-1];
}else if(a[i]<a[t[1]]){
r[i]=0;
t[1]=i;
}else if(a[i] <a[t[k]]){
ans =binary_search(t,a,k,a[i]);
t[ans]=i;
r[t[ans]]=t[ans-1];
}
}
cout<<k<<"\n";
afis(t[k]);
return 0;
}