Pagini recente » Cod sursa (job #1995960) | Cod sursa (job #1274555) | Cod sursa (job #778503) | Cod sursa (job #2101110) | Cod sursa (job #1249246)
/**
* Find the longest increasing subsequence = lis
* last[i] = the position where it ends the lis of exactly i elements
*/
#include <stdio.h>
#define MAXN 100001
int v[MAXN], last[MAXN], n, lis_length;
void find_lis()
{
int i, left, right, middle;
last[1] = 1;
lis_length = 1;
for (i = 2; i <= n; i++) {
left = 1, right = lis_length;
while (left <= right) {
middle = (left + right) / 2;
if (v[i] > v[ last[middle] ]) {
left = middle + 1;
} else {
right = middle - 1;
}
}
if (left == lis_length + 1) lis_length = lis_length + 1;
last[left] = i;
}
}
void build_sol(int pos, int len, FILE *fdout)
{
if (len > 1)
build_sol(last[len - 1], len - 1, fdout);
fprintf(fdout, "%d ", v[pos]);
}
int main()
{
FILE *fdin = fopen("scmax.in", "r");
FILE *fdout = fopen("scmax.out", "w");
int i;
fscanf(fdin, "%d", &n);
for (i = 1; i <= n; i++) fscanf(fdin, "%d", &v[i]);
find_lis();
fprintf(fdout, "%d\n", lis_length);
build_sol(last[lis_length], lis_length ,fdout);
fclose(fdin);
fclose(fdout);
return 0;
}