Pagini recente » Cod sursa (job #1011734) | Cod sursa (job #3174293) | Cod sursa (job #79930) | Cod sursa (job #1914138) | Cod sursa (job #1122665)
#include <iostream>
#include <cstdio>
#define Nmax 100010
using namespace std;
int N;
int Nr,poz;
int L[Nmax],A[Nmax],V[Nmax];
void Citire()
{
scanf("%d",&N);
for(int i=1;i<=N;++i)
scanf("%d ",&A[i]);
}
int Caut(int x)
{
int p,u,m;
p=1;
u=Nr;
m=(p+u)/2;
while(p<=u)
{
if(x<=V[m] && x>V[m-1])
return m;
else
{
if(x>V[m])
{
p=m+1;
m=(p+u)/2;
}
else
{
u=m-1;
m=(p+u)/2;
}
}
}
return -1;
}
void Afisare(int i)
{
for(int j=i-1;j>0;--j)
if(L[j]+1==L[i])
{
Afisare(j);
break;
}
printf("%d ",A[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
Citire();
Nr=1;
V[1]=A[1];
L[1]=1;
for(int i=2;i<=N;++i)
{
poz=Caut(A[i]);
if(poz==-1)
{
V[++Nr]=A[i];
L[i]=Nr;
}
else
{
V[poz]=A[i];
L[i]=poz;
}
}
printf("%d\n",Nr);
for(int i=N;i>=0;--i)
if(L[i]==Nr)
{
Afisare(i);
break;
}
return 0;
}