Cod sursa(job #363957)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 15 noiembrie 2009 09:45:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector <int> bin(100001),l(100001),ant(100001),a(100001);
int n,l1,bin1;
int bs(int x)
{
	int i,step;
	for (step=1;step<=bin1;step<<=1);
	for (i=0;step;step>>=1)
		if (i+step<=bin1&&a[bin[i+step]]<x)
			i+=step;
	return ++i;
}
void rec(int p)
{
	if(ant[p]>0)
		rec(ant[p]);
	printf("%d ",a[p]);
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	scanf("%d",&a[1]);
	bin[++bin1]=1;
	l[1]=1;
	for(int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]);
		l1=bin1+1;
		if(a[bin[bin1]]<a[i])
			bin[++bin1]=i;
		else
		{
			l1=bs(a[i]);
			bin[l1]=i;
		}
		l[i]=l1;
		ant[i]=bin[l1-1];
	}
	printf("%d\n",bin1);
	rec(max_element(l.begin()+1,l.begin()+n+1)-l.begin());
	return 0;
}