Cod sursa(job #508149)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 7 decembrie 2010 17:32:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <algorithm>
#include <set>
#define NMAX 100005
#define pii pair<int,int>
#define f first
#define s second
#define mp make_pair
using namespace std;
int n,A[NMAX],best[NMAX],rez,st;
multiset <pii> B;
void read()
{
	scanf("%d",&n);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
}
void solve()
{
	multiset <pii> :: reverse_iterator x;
	int i,bestv;
	for (i=1; i<=n; i++)
	{
		bestv=0;
		for (x=B.rbegin(); x!=B.rend(); x++)
			if ((*x).s<A[i])
			{
				bestv=(*x).f;
				break ;
			}
		best[i]=bestv+1;
		B.insert(mp(best[i],A[i]));
		if (best[i]>rez)
			rez=best[i];
		if (best[i]==rez)
			st=i;
	}
}
void reconst(int x,int val)
{
	int i;
	if (val==1)
	{
		printf("%d ",A[x]);
		return ;
	}
	for (i=x-1; i>=1; i--)
		if (best[i]==val-1 && A[x]>A[i])
		{
			reconst(i,val-1);
			printf("%d ",A[x]);
			return ;
		}
}
void show()
{
	printf("%d\n",rez);
	reconst(st,rez);
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	read();
	solve();
	show();
	return 0;
}