Pagini recente » Monitorul de evaluare | Cod sursa (job #785590) | Cod sursa (job #1001220) | Cod sursa (job #1011440) | Cod sursa (job #3306114)
#include <iostream>
#include<fstream>
using namespace std;ifstream fin("scmax.in");ofstream fout("scmax.out");
int n,v[100005],dp[100005],tata[100005],st,dr,m,rsp,i,lg,idx,afis[100005];const int INF=2e9+9;
int main()
{
fin>>n;v[0]=-INF;v[n+1]=INF;for(i=1;i<=n;i++)fin>>v[i],dp[i]=n+1;
for(i=1;i<=n;i++){
st=0;dr=lg;while(st<=dr){
m=(st+dr)/2;
if(v[i]>v[dp[m]]){rsp=m;st=m+1;}
else dr=m-1;
}lg=max(lg,rsp+1);
dp[rsp+1]=i;
tata[i]=dp[rsp];
}fout<<lg<<'\n';idx=dp[lg];
for(i=lg;i>0;i--){
afis[i]=v[idx];
idx=tata[idx];
}
for(i=1;i<=lg;i++)fout<<afis[i]<<' ';
return 0;
}