Pagini recente » Cod sursa (job #3156053) | Cod sursa (job #3177071) | Cod sursa (job #1566219) | Cod sursa (job #1110844) | Cod sursa (job #1533168)
#include <iostream>
#include <cstdio>
#define lim 100005
using namespace std;
int n,v[lim],best[lim],L[lim],p[lim],nr=1,maxim,retin;
int caut(int x)
{
int st=0,dr=nr;
int mij=(st+dr)/2;
while (st<=dr)
{
if ( v[L[mij]] < x && v[L[mij+1]] >= x)
return mij;
if (v[L[mij]] < x)
st=mij+1;
else dr=mij-1;
mij=(st+dr)/2;
}
return nr;
}
void afis(int ind)
{
if (ind)
{
afis(p[ind]);
printf("%d ",v[ind]);
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&v[i]);
best[0]=0;best[1]=1;L[1]=1;p[1]=0;
///best 1=1(lungime maxima), L->vectorul de indici
for (int i=2;i<=n;++i)
{
int loc=caut(v[i]);
if (loc == nr)
++nr;
L[++loc]=i;
best[i]=loc; ///maximul pentru el. respectiv e pozitia lui in vector L
p[i]=L[loc-1]; ///il memorez pe cel de dinainte pentru afisare
if (best[i] > maxim)
{
maxim=loc;
retin=i;
}
}
printf("%d\n",maxim);
afis(retin);
return 0;
}