Pagini recente » Cod sursa (job #2173090) | Cod sursa (job #2960918) | Cod sursa (job #1752670) | Monitorul de evaluare | Cod sursa (job #690807)
Cod sursa(job #690807)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int v[100005],minim[100005],dp[100005];
vector<int> v2;
int main()
{
int n,maxim=0,ind=0;
freopen("scmax.in","r", stdin);
freopen("scmax.out","w", stdout);
scanf("%d",&n);
scanf("%d",&v[1]);
minim[0]=-1<<30;
dp[1]=1;
minim[1]=v[1];
int lgmax=1;
for(int i=2;i<=n;i++)
{
scanf("%d",&v[i]);
for(int j=lgmax;j>=0;j--)
if(minim[j]<v[i])
{
dp[i]=j+1;
break;
}
if(dp[i]>lgmax)
{
lgmax++;
minim[lgmax]=v[i];
}
else
{
minim[dp[i]]=min(minim[dp[i]],v[i]);
}
if(dp[i]>maxim)
{
ind=i;
maxim=dp[i];
}
}
printf("%d\n",maxim);
v2.push_back(v[ind]);
for(int i=ind-1;i>=1;i--)
{
if(v2.back()>v[i])
v2.push_back(v[i]);
}
for(int i=v2.size()-1;i>=0;i--)
printf("%d ",v2[i]);
return 0;
}