Cod sursa(job #709479)

Utilizator ms-ninjacristescu liviu ms-ninja Data 8 martie 2012 10:05:31
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
using namespace std;
#define dim 100005
#define inf 0x3f3f3f3f
int v[dim], best[dim], binar[dim],i,sol[dim];

int cautare(int nr, int ls, int ld)
{
	int mijloc;
	
		while(ls<=ld)
		{
			mijloc=(ls+ld)>>1;
			if(nr<binar[mijloc] && nr>binar[mijloc-1])
			{
				binar[mijloc]=nr;
				return best[mijloc];
			}
			else
				if(nr>binar[mijloc])
				{
					best[i]=max(best[i],best[mijloc]+1);
					ls=mijloc+1;
				}
				else
					ld=mijloc-1;
		}
	
}

int main()
{
	ifstream fin("scmax.in");
	ofstream fout("scmax.out");
	int n, m,  j, sf=0,valmaxim=0,poz;
	
	fin>>n;
	
	for(i=1;i<=n;++i)
	{
		fin>>v[i];
		
		if(v[i]>binar[sf])
		{
		
			binar[++sf]=v[i];
			best[i]=sf;
		}
		else
			best[i]=cautare(v[i],1,sf);
		
		
		if(best[i]>valmaxim)
		{
			valmaxim=best[i];
			poz=i;
		}
	}
	
	fout<<valmaxim <<'\n';
	long long nr=0,mare=v[poz];
	sol[++nr]=mare;
	--valmaxim;
	for(i=poz-1;i>=1;--i)
	{
		if(best[i]==valmaxim && v[i]<mare)
		{
			--valmaxim;
			mare=v[i];
			sol[++nr]=v[i];
		}
	}
	
	for(i=nr;i>=1;--i)
		fout<<sol[i] <<" ";
	
	return 0;
}