Pagini recente » Cod sursa (job #1418060) | Cod sursa (job #3212574) | Cod sursa (job #1895885) | Cod sursa (job #331908) | Cod sursa (job #915175)
Cod sursa(job #915175)
#include<cstdio>
using namespace std;
#define MAX 100001
#define INF 2000000001
int N , V[MAX] , Q[MAX] , P[MAX] , T[MAX] ,maxim , nr ;
void citire();
void solve();
void tipar();
int insert(int x , int ls , int ld);
void drum(int x,int i);
int main()
{
citire();
solve();
tipar();
return 0;
}
void citire()
{
freopen("scmax.in" , "r" , stdin );
scanf("%d" , &N);
for( int i = 1 ; i <= N ; ++i )
scanf("%d" , &V[i]);
}
void solve()
{
Q[1] = V[1] ;
P[1] = nr = 1;
for(int i = 2 ; i <= N ; ++i )
{
if(V[i] > Q[nr])
Q[++nr] = V[i];
else P[i]=insert(V[i],0,nr);
if(nr > maxim)maxim = nr;
}
}
int insert(int x ,int ls , int ld )
{
int m;
while(ls <= ld)
{
m = (ls+ld)/2;
if(x > Q[m] && x <= Q[m+1])
{
Q[m+1] = x;
return m+1;
}
else
if(x <= Q[m])ld = m;
else ls = m+1;
}
}
void tipar()
{
freopen("scmax.out" , "w" , stdout);
printf("%d\n" , maxim);
int aux = maxim;
for( int i = N ;maxim;i--)
if(P[i] == maxim )
Q[maxim--] = V[i];
for( int i = 1 ; i <= aux ; ++i )
printf("%d " , Q[i]);
}