Cod sursa(job #219074)

Utilizator tvladTataranu Vlad tvlad Data 5 noiembrie 2008 01:41:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <cstdio>
#include <vector>
using namespace std;

const int N = 100001;

int n;
int x[N], m[N], p[N];

int main() {
	freopen("scmax.in","rt",stdin);
	freopen("scmax.out","wt",stdout);
	scanf("%d",&n);
	for (int i = 1; i <= n; ++i)
		scanf("%d",&x[i]);
	
	int max = 0;
	m[0] = 0;
	for (int i = 1; i <= n; ++i) {
		int j = 0;
		for (int step = 1 << 17; step; step >>= 1)
			if (j+step <= max && x[m[j+step]] < x[i])
				j += step;
		p[i] = m[j];
		if (j == max || x[i] < x[m[j+1]]) {
			m[j+1] = i;
			if (j+1 > max)
				max = j+1;
		}
	}
	
	printf("%d\n",max);
	vector<int> rez;
	for (int i = m[max]; i; i = p[i])
		rez.push_back(x[i]);
	for (int i = rez.size()-1; i >= 0; --i)
		printf("%d ",rez[i]);
	printf("\n");
	return 0;
}