Cod sursa(job #1189363)

Utilizator MarianMMorosac George Marian MarianM Data 22 mai 2014 16:21:31
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#define _CRT_SECURE_NO_DEPRECATE

#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <list>
#include <string>
#include <iterator>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <tuple>
using namespace std;

#define NMAX 100001

int n, P[NMAX], M[NMAX], X[NMAX], S[NMAX], L, newL;

int main(){
	int i, j, lo, hi, mid, k;

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

	scanf("%d", &n);
	for (i = 0; i < n; i++) scanf("%d", &X[i]);

	L = 0;
	for (i = 0; i < n; i++){
		lo = 1; hi = L;
		while (lo <= hi){
			mid = lo + (hi - lo) / 2;
			if (X[M[mid]] < X[i]) lo = mid + 1;
			else hi = mid - 1;
		}
		newL = lo;
		P[i] = M[newL - 1];
		
		if (newL > L){
			M[newL] = i;
			L = newL;
		}
		else if (X[i] < X[M[newL]]){
			M[newL] = i;
		}
	}

	k = M[L];
	for (i = L - 1; i >= 0; i--){
		S[i] = X[k];
		k = P[k];
	}

	for (i = 0; i < L; i++) printf("%d ", S[i]);

	return 0;
}