Pagini recente » Cod sursa (job #1296811) | Cod sursa (job #2472278) | Cod sursa (job #2804166) | Cod sursa (job #2847807) | Cod sursa (job #2905513)
#include <stdio.h>
#include <iostream>
int v[100002];
int maxLen[100002];
int minLast[100002];
int minLastPos[100002];
int previous[100002];
int r[100002];
int main() {
FILE *fin, *fout;
int n;
int i, mijloc;
int stanga, dreapta, bestLast;
int res, ind;
fin = fopen("scmax.in", "r");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++)
fscanf(fin, "%d", &v[i]);
fclose(fin);
minLast[0] = 0;
for (i = 1; i <= n; i++)
minLast[i] = 2000000001;
res = 1;
for (i = 0; i < n; i++) {
stanga = 0;
dreapta = i + 1;
// minLast[i + 1] == 2000000000
while (dreapta - stanga > 1) {
int mij = (stanga + dreapta) / 2;
if (minLast[mij] < v[i])
stanga = mij;
else
dreapta = mij;
}
if (minLast[dreapta] > v[i])
minLastPos[dreapta] = i + 1;
minLast[dreapta] = std::min(minLast[dreapta], v[i]);
previous[i] = minLastPos[dreapta - 1];
maxLen[i] = dreapta;
if (res < dreapta) {
res = dreapta;
bestLast = i;
}
//printf("%d %d %d minLast: ", stanga, dreapta, minLast[stanga] < v[i]);
//for (int j = 0; minLast[j] != 2000000000; j++)
//printf("%d ", minLast[j]);
//printf("maxLen: ");
//for (int j = 0; j <= i; j++)
//printf("%d ", maxLen[j]);
//printf("minLastPos: ");
//for (int j = 0; j <= n; j++)
//printf("%d ", minLastPos[j]);
//printf("previous: ");
//for (int j = 0; j <= n; j++)
//printf("%d ", previous[j]);
//printf("\n");
}
fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", res);
ind = 0;
i = bestLast;
while (i >= 0) {
r[ind++] = v[i];
i = previous[i] - 1;
}
for (ind--; ind >= 0; ind--)
fprintf(fout, "%d ", r[ind]);
fclose(fout);
return 0;
}