Cod sursa(job #2483692)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 30 octombrie 2019 09:21:10
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

using namespace std;
int n,best[100002],sir[100003],v[100003],maxim,poz,kontor=1,variabila;
int cautare_binara_dinaiajmen (int last,int nr)
{
	int step=1,i=0;
	for(;(step<<1)<=kontor;step=(step<<1));
	for(;step>0;step=(step>>1))
		if(sir[i+step]<nr && i+step<=kontor)
			i+=step;
	return i;
}
void scmax ()
{
	sir[1]=v[1];best[1]=1;
	for(int i=2;i<=n;++i)
	{
		variabila=cautare_binara_dinaiajmen(kontor,v[i])+1;
		if(variabila-1==kontor)
            sir[++kontor]=v[i];
        else
            sir[variabila]=v[i];
		best[i]=variabila;
		if(best[i]>maxim)
			maxim=best[i],poz=i;
	}
}
int main ()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d", &n);
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]);
	scmax();
	printf("%d\n", maxim);
	sir[maxim]=v[poz];int aux=maxim;
	for(int i=poz-1;i>0 && maxim>0;--i)
		if(best[i]==maxim-1 && v[i]<sir[maxim])
			sir[--maxim]=v[i];
	for(int i=1;i<=aux;++i)
		printf("%d ", sir[i]);
	return 0;
}