Pagini recente » Cod sursa (job #1580575) | Cod sursa (job #3283927) | Cod sursa (job #1131475) | Cod sursa (job #1009627) | Cod sursa (job #740928)
Cod sursa(job #740928)
#include<cstdio>
using namespace std;
int nr,b[100100],a[100100],p[100100],s[100100],i,n,mx,ultimul,pos,lg;
int cautbin(int dr,int x)
{
int st,mij;
st=1;
while (st<=dr){
mij=(st+dr)/2;
if (x==s[mij]) return mij;
if (x<s[mij])
dr=mij-1;
else
st=mij+1;
}
return st;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for (i=1;i<=n;i++)
{
s[i]=2000000001;
}
lg=1;
s[1]=a[1];
p[1]=1;
for (i=2;i<=n;i++)
{
p[i]=cautbin(lg,a[i]);
if (p[i]==1&&a[i]>s[1])
{
lg++;
p[i]=lg;
s[p[i]]=a[i];
}
else
{
s[p[i]]=a[i];
if (p[i]>lg)
lg=p[i];
}
}
mx=0;
pos=0;
for (i=1;i<=n;i++)
{
if (p[i]>mx)
{
mx=p[i];
pos=i;
}
}
ultimul=pos;
printf("%d\n",mx);
b[1]=a[ultimul];
nr=1;
for (i=pos-1;i>=1;i--)
{
if (p[i]==p[ultimul]-1&&a[i]<a[ultimul])
{
ultimul=i;
nr++;
b[nr]=a[ultimul];
}
}
for (i=nr;i>=1;i--)
{
printf("%d ",b[i]);
}
printf("\n");
return 0;
}