Pagini recente » Cod sursa (job #2817355) | Cod sursa (job #2754097) | Cod sursa (job #630345) | Cod sursa (job #2339942) | Cod sursa (job #1887784)
#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, step, pos;
FOR(i, n) {
// Binary search the value in M
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);
step = 0;
for (int p = maxPos; p != -1; p = P[p])
M[step++] = p;
for (--step; step > -1; --step)
fprintf(f, "%d ", A[M[step]]);
fprintf(f, "\n");
free(A);
free(P);
free(M);
return 0;
}