Cod sursa(job #690807)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 25 februarie 2012 21:52:59
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int v[100005],minim[100005],dp[100005];
vector<int> v2;

int main()
{
	int n,maxim=0,ind=0;
	freopen("scmax.in","r", stdin);
	freopen("scmax.out","w", stdout);
	scanf("%d",&n);
	scanf("%d",&v[1]);
	minim[0]=-1<<30;
	dp[1]=1;
	minim[1]=v[1];
	int lgmax=1;
	
	for(int i=2;i<=n;i++)
	{
		scanf("%d",&v[i]);
		for(int j=lgmax;j>=0;j--)
		if(minim[j]<v[i])
		{
			dp[i]=j+1;
			break;
		}
		if(dp[i]>lgmax)
		{
			lgmax++;
			minim[lgmax]=v[i];
		}
		else
		{
			minim[dp[i]]=min(minim[dp[i]],v[i]);
		}
		if(dp[i]>maxim)
		{
			ind=i;
			maxim=dp[i];
		}
	}
	printf("%d\n",maxim);
	
	v2.push_back(v[ind]);
	for(int i=ind-1;i>=1;i--)
	{
		if(v2.back()>v[i])
			v2.push_back(v[i]);
		
	}
	for(int i=v2.size()-1;i>=0;i--)
		printf("%d ",v2[i]);
	return 0;
}