Cod sursa(job #1227527)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 10 septembrie 2014 19:40:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
using namespace std;
int n,a[100002],M[100002],P[100002];
void reconstruct(int end){
	if(end == -1)
		return;
	else{
		reconstruct(P[end]);
		printf("%d ",a[end]);
	}
}
int binary_search(int elt, int r){
	int l = 0;
	int m;
	while(l <= r){
		m = l + ((r - l) >> 1);
		if(a[M[m]] < elt)
			l = m + 1;
		else
			r = m - 1;
	}
	return l;
}
int main(){
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(int i = 0; i < n; i++){
		scanf("%d",&a[i]);
		P[i] = -1;
		M[i] = 0;
	}
	int L = 1,m = 0;
	M[0] = 0;
	P[0] = -1;
	for(int i = 1; i < n; i++){
		if(a[i] > a[M[L - 1]]){
			P[i] = M[L - 1];
			M[L++] = i;			
		}
		else{
			int idx = binary_search(a[i],L);
			M[idx] = i;
			if(idx - 1 < 0)
				P[i] = -1;
			else
				P[i] = M[idx - 1];
		}
	}
	printf("%d\n",L);
	reconstruct(M[L - 1]);
	return 0;
}