Pagini recente » Cod sursa (job #1238779) | Cod sursa (job #1978031) | Cod sursa (job #1875668) | Cod sursa (job #1149386) | Cod sursa (job #457928)
Cod sursa(job #457928)
#include <stdio.h>
#include <stdlib.h>
int X[100001];
int n;
int M[100001];
int L;
int P[100001];
int b_search(int val) {
if (L==0) return 0;
int s = 1, e = L;
while (s<e) {
int m = (s + e) / 2;
int valm = X[M[m]];
if (valm >= val)
e = m-1;
else
s = m+1;
}
while (s!=0 && X[M[s]] > val) s--;
while (s == 0 || (s <= L && X[M[s]] < val)) s++;
s--;
if (s<=0) return 0;
return s;
}
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++) {
int j = b_search(X[i]);
P[i] = M[j];
if (L==j || X[M[j+1]]>X[i]) {
M[j+1] = i;
if (j+1>L) L = j+1;
}
}
i = M[L]; j = 0;
while(1) {
M[j] = X[i];
if (i==0) break;
j++;
i = P[i];
}
printf("%d\n", L);
for (i=L-1;i>=0;i--) printf("%d ", M[i]);
printf("\n");
return 0;
}