Pagini recente » Cod sursa (job #1253464) | Cod sursa (job #1737543) | Cod sursa (job #254964) | Cod sursa (job #139780) | Cod sursa (job #1887766)
#include <stdio.h>
#include <stdlib.h>
#define N 100001
#define FOR(i, n) for (int i = 0; i < n; ++i)
int main() {
FILE *f = fopen("scmax.in", "r");
int n;
fscanf(f, "%d", &n);
int *A = (int*) malloc(n * sizeof(int));
int *P = (int*) malloc(n * sizeof(int));
int *M = (int*) malloc(n * sizeof(int));
FOR(i, n)
fscanf(f, "%d", &A[i]);
fclose(f);
int maxLen = 0, maxVal = 0, maxPos = 0;
FOR(i, n) {
// Binary search the value in M
int step, pos;
for (step = 1; step < maxLen; step <<= 1);
for (pos = 0; step; step >>= 1) {
int np = pos + step;
if (np <= maxLen && A[M[np]] < A[i])
pos += step;
}
if (pos + 1 > maxVal) {
maxVal = pos + 1;
maxPos = i;
}
if (pos == 0)
P[i] = -1;
else
P[i] = M[pos];
if (pos == maxLen)
M[++maxLen] = i;
else if (A[i] < A[M[pos + 1]])
M[pos + 1] = i;
}
f = fopen("scmax.out", "w");
fprintf(f, "%d\n", maxVal);
int k = 0;
for (int p = maxPos; p != -1; p = P[p])
M[k++] = p;
for (--k; k > -1; --k)
fprintf(f, "%d ", A[M[k]]);
fprintf(f, "\n");
return 0;
}