Pagini recente » Cod sursa (job #3182876) | Cod sursa (job #2429100) | Cod sursa (job #2673717) | Cod sursa (job #1414757) | Cod sursa (job #221966)
Cod sursa(job #221966)
#include <cstdio>
#define MAX_N 100005
int V[MAX_N], ant[MAX_N], L[MAX_N], P[MAX_N];
int N, nr;
inline int maxim(int a, int b)
{
return (a > b)? a : b;
}
int find(int x)
{
int li = 0, lf = nr, m;
while(li <= lf)
{
m = (li + lf) >> 1;
if(V[P[m]] < x && V[P[m+1]] >= x) return m;
if(V[P[m]] > x) lf = m - 1;
else li = m + 1;
}
return nr;
}
void afisare(int i)
{
if(ant[i]) afisare(ant[i]);
printf("%d ",V[i]);
}
void find_scmax()
{
P[0] = 0;
L[1] = P[1] = 1;
nr = 1;
for(int i = 2; i <= N; ++i)
{
int poz = find(V[i]);
ant[i] = P[poz];
L[i] = poz+1;
P[poz + 1] = i;
nr = maxim(nr, poz+1);
}
int max = 0, poz;
for(int i = 1; i <= N; ++i)
if(L[i] > max)
max = L[i], poz = i;
printf("%d\n", max);
afisare(poz);
}
int main()
{
freopen("scmax.in","rt",stdin);
freopen("scmax.out","wt",stdout);
scanf("%d",&N);
for(int i = 1; i <= N; ++i)
scanf("%d",V+i);
find_scmax();
}