Cod sursa(job #174991)

Utilizator damaDamaschin Mihai dama Data 9 aprilie 2008 14:08:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <stdio.h>
#include <string.h>

int main()
{
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	int a[100001], q[100001], n, i, last = 0, prev[100001], temp;

	scanf("%d", &n);
	for(i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
	}
	memset(prev, 0, sizeof(prev));

	for(i = n; i > 0; --i)
	{
		int res = 0, min = 1, mid, max = last;
		while(min <= max)
		{
			mid = (min + max) / 2;
			if(a[i] >= a[q[mid]])
			{
				max = mid - 1;
			}
			else
			{
				res = mid;
				min = mid + 1;
			}
		}
		q[res + 1] = i;
		prev[i] = q[res];
		if(res + 1 > last)
		{
			last = res + 1;
		}
	}

	printf("%d\n", last);

	temp = q[last];

	while(temp)
	{
		printf("%d ", a[temp]);
		temp = prev[temp];
	}


	return 0;
}