Cod sursa(job #176199)

Utilizator marinaMarina Horlescu marina Data 10 aprilie 2008 20:38:29
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
//Subsir crescator maximal
//Complexitate O(N logN)
#include <stdio.h>
#define INPUT "scmax.in"
#define OUTPUT "scmax.out"
#define NMAX 100001

int N;
int v[NMAX], s[NMAX], lung[NMAX], sir[NMAX];

int l;

int caut(int val)
{
	int st = 0, dr = l;
	while(st < dr)
	{
		int mij = (st+dr+1)/2;
		if(s[mij] >= val) dr = mij-1;
		else st = mij;
	}
	return st;
}

void afis()
{
	printf("%d\n", l);
	
	int i = N;
	while(lung[i] != l) --i;
	
	int ll = l;
	int val = sir[l] = v[i]; --ll;
	for(--i; i; --i)
		if(lung[i] == ll && v[i] < val)
			sir[ll] = val = v[i], --ll;
		
	for(i = 1; i < l; ++i)
		printf("%d ", sir[i]);
	printf("%d\n", sir[l]);
}
int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	scanf("%d", &N);
	int i;
	for(i = 1; i <= N; ++i)
		scanf("%d", &v[i]);
	
	s[1] = v[1]; 
	lung[1] = 1;
	l = 1;
	
	for(i = 2; i <= N; ++i)
		if(v[i] > s[l]) s[++l] = v[i], lung[i] = l;
		else
		{
			int poz = caut(v[i]);
			s[poz+1] = v[i];
			lung[i] = poz+1;
		}

	afis();
	return 0;
}