Pagini recente » Cod sursa (job #1997065) | Cod sursa (job #2292187) | Cod sursa (job #1501878) | Cod sursa (job #2130462) | Cod sursa (job #489644)
Cod sursa(job #489644)
/*8:52:40*/
#include <stdio.h>
#define S 100010
#define D if(0)
int n, L, X[S], M[S], P[S], R[S];
int bsearch(int val) {
int ii;
D printf("val: %d\n", val);
D printf("L: %d\nARR: ", L);
D for (ii=1;ii<=L;ii++) printf("%d ", X[M[ii]]);
D printf("\n");
if (L==0) return 0;
int i = 1, s = 0;
while (i<=L) i<<=1;
i>>=1;
while (i) {
if (((s | i) <= L) && X[M[s | i]]<val) s|=i;
i>>=1;
}
if (X[M[s]]<val) return s;
return 0;
}
int main() {
int i, j;
freopen("scmax.in", "r", stdin);
/*freopen("scmax.out", "w", stdout);*/
scanf("%d", &n);
for (i=0;i<n;i++) scanf("%d", X + i);
L=0;
for (i=0;i<n;i++) {
j = bsearch(X[i]);
D printf("j: %d\n", j);
P[i] = M[j];
if (j == L || X[M[j+1]] > X[i]) {
M[j+1] = i;
if (j+1>L) L = j+1;
}
}
j = bsearch(1000000);
j = M[L];
for (i=0;i<L;i++) {
R[i] = X[j];
j = P[j];
}
printf("%d\n", L);
for (i=L-1;i>=0;i--) {
printf("%d ", R[i]);
}
printf("\n");
}