Cod sursa(job #1249249)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 26 octombrie 2014 18:46:33
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
/** 
 * 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], prev[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;
		prev[i] = last[left - 1];
	}
}

void build_sol(int pos, FILE *fdout) 
{
	if (prev[pos])
		build_sol(prev[pos], 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], fdout);
	fclose(fdin);
	fclose(fdout);
	return 0;
}