Cod sursa(job #2589897)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 27 martie 2020 09:52:43
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;
int n,v[100003],best[100003],sir[100003],poz,kontor,ans,aux,sol[100005];
int cb (int nr) {
	int i=0,step=1;
	for(;(step<<1)<=kontor;step<<=1);
	for(;step>0;step>>=1)
		if(i+step<=kontor && sir[i+step]<nr)
			i+=step;
	return i;
}
void scmax () {
	best[1]=1;sir[++kontor]=v[1];
	for(int i=2;i<=n;++i) {
		poz=cb(v[i]);
		if(poz==kontor)
			best[i]=kontor+1,sir[++kontor]=v[i];
		else
			best[i]=poz+1,sir[poz+1]=v[i];
	}
	for(int i=1;i<=n;++i)
		if(best[i]>ans)
			ans=best[i],poz=i;
	aux=ans-1;sol[++sol[0]]=v[poz];
	for(int i=poz-1;i>0 && aux>0;--i)
		if(best[i]==aux && v[i]<sol[sol[0]])
			sol[++sol[0]]=v[i],--aux;
	printf("%d\n", ans);
	for(int i=sol[0];i>0;--i)
		printf("%d ", sol[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();
	return 0;
}