Cod sursa(job #2632492)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 3 iulie 2020 14:24:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
using namespace std;

const int NMAX=1e5+1, INF1=0, INF2=2e9+1;
int dp[NMAX+1], minn[NMAX+2], arr[NMAX+1], pred[NMAX+1], sir[NMAX+1]; 

int binar(int val, int sz)
{
	bool found=false;
	int st=0, dr=sz, mj;
	while(st<=dr && !found)
	{
		mj=(st+dr)/2;
		if(arr[minn[mj]]<arr[val] && arr[minn[mj+1]]>=arr[val])
			found=true;
		else if(arr[minn[mj]]>=arr[val])
			dr=mj-1;
		else
			st=mj+1;
	}
	return mj+1;
}

int main()
{
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	
	int N, sz=0;
	scanf("%d", &N);
	for(int i=1;i<=N;++i)
	{
		scanf("%d", &arr[i]);
		minn[i]=N+1;
	}

	arr[N+1]=INF2;
	arr[0]=INF1;

	for(int i=1;i<=N;++i)
	{
		dp[i]=binar(i, sz);
		pred[i]=minn[dp[i]-1];
		if(dp[i]==sz+1)
			minn[++sz]=i;
		else
			minn[dp[i]]=i;
	}

	printf("%d\n", sz);
	int curent=minn[sz];
	while(curent!=0)
	{
		sir[++sir[0]]=arr[curent];
		curent=pred[curent];
	}
	while(sir[0]!=0)
		printf("%d ", sir[sir[0]--]);
	return 0;
}