Cod sursa(job #2481720)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 27 octombrie 2019 12:41:23
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

using namespace std;
long long n,v[100003],stiva[100003],best[100003],k,maxim,poz,last;
long long c_binara (long long prima,long long ultima,long long nr)
{
	if(stiva[1]>=nr)
		return 0;
	while(prima<=ultima)
	{
		k=(prima+ultima)/2;
		if(stiva[k]<nr && (k==last || stiva[k+1]>=nr))
			return k;
		else if(stiva[k]<nr)
			prima=k+1;
		else if(stiva[k]>nr)
			ultima=k-1;
	}
}
void sc_max ()
{
	last=0;
	stiva[++last]=v[1];best[1]=1;
	for(int i=2;i<=n;++i)
	{
		last=c_binara(1,last,v[i]);
		stiva[++last]=v[i];best[i]=last;
		if(best[i]>maxim)
			maxim=best[i],poz=i;
	}
}
int main ()
{
	long long sol[100003],aux;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%lld", &n);
	for(int i=1;i<=n;++i)
		scanf("%lld", &v[i]);
	sc_max();
	printf("%lld\n", maxim);
	sol[maxim]=v[poz];aux=maxim;
	for(int i=poz-1;i>0;--i)
		if(best[i]==maxim-1 && v[i]<sol[maxim])
			sol[--maxim]=v[i];
	for(int i=1;i<=aux;++i)
		printf("%lld ", sol[i]);
	return 0;
}