Cod sursa(job #1342320)

Utilizator cociorbaandreiAndrei Cociorba cociorbaandrei Data 13 februarie 2015 20:39:29
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#define INF  10000000
#define nmax 100010

using namespace std;


int i,n,V[nmax],len,S[nmax], k;
int P[nmax],Q[nmax];

int insert(int key, int lo, int hi){
	int mid = (lo + hi) / 2;
	if(lo == hi){
		if(len < hi) Q[++len+1] = INF;
		Q[lo] = key;
		return lo;
	}else if(key <= Q[mid]) return insert(key, lo, mid);
		else return insert(key, mid + 1, hi);
}


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

	scanf("%d", &n);
	Q[1] = INF;
 	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", V + i);
		P[i] = insert(V[i], 1, len + 1);
	}

	
	for (int i = len,k = n; i; i--)
	{
		while(P[k] != i) k--;
			S[i] = V[k];
	}
	printf("%d\n", len);
	for (int i = 1; i <= len; ++i)
		printf("%d ", S[i]);
	return 0;
}