Pagini recente » Cod sursa (job #93479) | Rating Pal Cristian (cristian.pal) | Cod sursa (job #1703333) | Cod sursa (job #2971292) | Cod sursa (job #1559265)
#include <cstdio>
#define MAX 100000
using namespace std;
int v[MAX+1], best[MAX+1], secv[MAX+1], last[MAX+1];
int n, nr, maxim;
void afisare(int i)
{
if(last[i]!=0) afisare(last[i]);
printf("%d ", v[i]);
}
int cauta(int x)
{
int st=0, dr=nr, mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[secv[mij]]<x&&v[secv[mij+1]]>=x)
return mij;
if(v[secv[mij]]<x)
st=mij+1;
else dr=mij-1;
}
return nr;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i, maxel;
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &v[i]);
nr=1;
best[1]=1;
secv[1]=1;
for(i=2;i<=n;i++)
{
maxel=cauta(v[i]);
best[i]=maxel+1;
last[i]=secv[maxel];
secv[maxel+1]=i;
if(nr<maxel+1)
nr=maxel+1;
}
maxim=-1;
int poz;
for(i=1;i<=n;i++)
{
if(best[i]>maxim)
{
maxim=best[i];
poz=i;
}
}
printf("%d\n", maxim);
afisare(poz);
return 0;
}