Cod sursa(job #489151)

Utilizator ChallengeMurtaza Alexandru Challenge Data 1 octombrie 2010 15:32:57
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>

using namespace std;

const char InFile[]="scmax.in";
const char OutFile[]="scmax.out";
const int MaxN=100010;

ifstream fin(InFile);
ofstream fout(OutFile);

int X[MaxN],M[MaxN],P[MaxN],n;

int sarci(int val)
{
	int p=1,u=M[0],m,sol=1;
	while(p<=u)
	{
		m=(p+u)>>1;
		if(val<=X[M[m]])
		{
			u=m-1;
		}
		else
		{
			sol=m;
			p=m+1;
		}
	}
	if(X[M[sol]]>val)
	{
		sol=0;
	}
	return sol;
}

void afis(int pos)
{
	if(pos!=0)
	{
		afis(P[pos]);
		fout<<X[pos]<<" ";
	}
}

int main()
{
	fin>>n;
	for(register int i=1;i<=n;++i)
	{
		fin>>X[i];
	}
	fin.close();

	M[0]=1;
	M[1]=1;
	P[1]=0;
	for(register int i=2;i<=n;++i)
	{
		int j=sarci(X[i]);
		if(j>0)
		{
			P[i]=M[j];
			if(j+1>M[0])
			{
				M[j+1]=i;
				++M[0];
			}
			else if(X[i]<X[M[j+1]])
			{
				M[j+1]=i;
			}
		}
		else
		{
			P[i]=0;
			if(X[i]<X[M[1]])
			{
				M[1]=i;
			}
		}
	}

	fout<<M[0]<<"\n";
	afis(M[M[0]]);
	fout.close();
	return 0;
}