Cod sursa(job #906122)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 6 martie 2013 15:25:03
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> v;
int n;
int size = 0;
int main(){
	int x;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&x);v.push_back(x);
	}

	vector<int> a(100005);
	vector<int> poz(100005);
	vector<int> prev(100005);

	a[0]=0;
	poz[0]=0;
	
	int maxPoz = 0;

	for(int i=0;i<n;i++){
		vector<int> ::iterator it = upper_bound(a.begin(),a.begin()+size+1,v[i]);
		
		if(it-a.begin()==(size+1) && a[size]!=v[i]){
			size++;
			maxPoz = i;
		}

		a[(it-a.begin())]=v[i];
		poz[(it-a.begin())]=i;

		prev[i]=poz[it-a.begin()-1];
	}

	printf("%d\n",size);
	vector<int> ans;
	while(maxPoz !=0){
		ans.push_back(maxPoz);
		maxPoz = prev[maxPoz];
	}

	for(int i=size-1;i>=0;i--)
		printf ("%d ",v[ans[i]]);
	return 0;
}