Cod sursa(job #2632487)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 3 iulie 2020 14:12:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

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()
{
	int N, sz=0;
	fin>>N;
	for(int i=1;i<=N;++i)
	{
		fin>>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;
	}

	fout<<sz<<'\n';
	int curent=minn[sz];
	while(curent!=0)
	{
		sir[++sir[0]]=arr[curent];
		curent=pred[curent];
	}
	while(sir[0]!=0)
		fout<<sir[sir[0]--]<<' ';
	return 0;
}