Pagini recente » Cod sursa (job #1803330) | Cod sursa (job #1393371) | Cod sursa (job #2295985) | Cod sursa (job #2554866)
#include <stdio.h>
#define NMAX 100001
int n, v[NMAX], best[NMAX], p[NMAX], maxim, k, L[NMAX], nr;
void af (int i) {
if (p[i])
af (p[i]);
printf ("%d ", v[i]);
}
int caut (int x) {
int st=0, dr=nr, m;
while (st<=dr) {
m=(st+dr)>>1;
if (v[L[m]]<x && v[L[m+1]]>=x)
return m;
else
if (v[L[m+1]]<x)
st=m+1;
else
dr=m-1;
}
return nr;
}
int main (void) {
freopen ("scmax.in", "r", stdin); freopen ("scmax.out", "w", stdout);
int i, j, poz;
nr=1;
scanf ("%d", &n);
for (i=1; i<=n; i++)
scanf ("%d", v+i);
best[1]=L[1]=1, L[0]=0;
for (i=2; i<=n; i++) {
poz=caut(v[i]);
p[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if (nr<poz+1)
nr=poz+1;
}
maxim=0, poz=0;
for (i=1; i<=n; i++)
if (maxim<best[i])
maxim=best[i], poz=i;
printf ("%d\n", maxim);
af(poz);
return 0;
}