Cod sursa(job #1357518)

Utilizator cristian.enciuCristian Enciu cristian.enciu Data 23 februarie 2015 22:45:39
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>

int v[100010];
int l[100010];
int b[100010];
int r[100010];
int n, pos, lim;

void search(int &val)
{
	int start = 0, stop = lim;

	pos = (start + stop) / 2;
	while(start <= stop) {
		if(v[l[pos]] < val && val <= v[l[pos + 1]]) return;
		else if(v[l[pos + 1]] < val) start = pos + 1;
		else stop = pos - 1;

		pos = (start + stop) / 2;
	}

	pos = lim;
}

void print(int i)
{
	if(r[i] > 0)
		print(r[i]);
	printf("%d ", v[r[i]]);
}

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

	scanf("%d", &n);
	for(int i = 1 ; i <= n ; ++i) {
		scanf("%d", &v[i]);
	}

	lim = b[1] = l[1] = 1;

	for(int i = 2 ; i <= n ; ++i) {
		search(v[i]);
		r[i] = l[pos];
		++pos;
		l[pos] = i;
		b[i] = pos;
		lim = lim < pos ? pos : lim;
	}

	int max = 0;
	for(int i = 1 ; i <= n ; ++i) {
		if(max < b[i]) {
			max = b[i];
			pos = i;
		}
	}

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

	print(pos);

	return 0;
}