Pagini recente » Cod sursa (job #2505707) | Cod sursa (job #2081203) | Cod sursa (job #826315) | Cod sursa (job #2200750) | Cod sursa (job #627373)
Cod sursa(job #627373)
#include <stdio.h>
#define NMAX 100010
int A[NMAX], pre[NMAX], len[NMAX], L[NMAX], poz, max;
int n, nr;
int bs(int x)
{
int low = 0, high = nr;
int mid = low + (high-low)/2;
while (low <= high) {
if (A[L[mid]] < x && A[L[mid+1]] >= x)
return mid;
else if (A[L[mid+1]] < x) {
low = mid+1;
mid = low + (high-low)/2;
}
else {
high = mid-1;
mid = low + (high-low)/2;
}
}
return nr;
}
void print(int i)
{
if (pre[i] > 0)
print(pre[i]);
printf("%d ", A[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i;
scanf("%d", &n);
for (i=1; i<=n; ++i)
scanf("%d", &A[i]);
nr = 1;
len[1] = L[1] = 1;
for (i=2; i<=n; ++i) {
int p = bs(A[i]);
pre[i] = L[p];
len[i] = p + 1;
L[p+1] = i;
if (nr < p+1)
nr = p+1;
}
for (i=1; i<=n; ++i)
if (len[i] > max) {
max = len[i];
poz = i;
}
printf("%d\n", max);
i = poz;
print(i);
return 0;
}