Pagini recente » Cod sursa (job #3142452) | Cod sursa (job #1244687) | Cod sursa (job #1249208) | Cod sursa (job #715241) | Cod sursa (job #2835187)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int mx=1e5+100;
const int inf=2e9+100;
int n,v[mx],dp[mx],ind[mx],prv[mx],result[mx];
void read(){
in>>n;
for(int i=0;i<n;i++){
in>>v[i];
}
}
int search(int x){
int l=0,r=n,m;
while(l<r){
m=(l+r)/2;
if(dp[m]<=x){
l=m+1;
}
else{
r=m;
}
}
return l;
}
void solve(){
dp[0]=-inf;
ind[0]=-1;
for(int i=1;i<=n;i++)
dp[i]=inf;
for(int i=0;i<n;i++){
int j=search(v[i]);
if(dp[j-1]<v[i]){
dp[j]=v[i];
ind[j]=i;
prv[i]=ind[j-1];
}
}
int length=0;
for(int i=0;i<=n;i++){
if(dp[i]!=inf){
length=i;
}
}
int now=ind[length],cnt=0;
while(now!=-1){
result[cnt++]=v[now];
now=prv[now];
}
out<<length<<'\n';
for(int i=cnt-1;i>=0;i--)
out<<result[i]<<" ";
}
int main(){
read();
solve();
return 0;
}