Cod sursa(job #664660)

Utilizator marinutzacatana marina marinutza Data 20 ianuarie 2012 16:39:59
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[100005],x[100005],l[100005],n,nr,lmax,i,poz,k;
int cautare(int a,int x[100005])
{
	int p,u,mij;
	p=1;
	u=nr;
	while(p<=u)
	{
		mij=(p+u)/2;
		if(a==x[mij])
		{
			return mij;
		}
		else
		{
			if(x[mij]>a)
			{
				u=mij-1;
			}
			else
			{
				p=mij+1;
			}
		}
	}
	return p;
}
void afisare(int p)
{
	int i,t;
	if(l[p]>1)
	{
		for(i=p-1;i>0;i--)
		{
			if(l[i]+1==l[p] && a[i]<a[p])
			{
				t=i;
				break;
			}
		}
		afisare(t);
		g<<a[p]<<' ';
	}
	else
	{
		g<<a[p]<<' ';
	}
}
int main()
{
	f>>n;
	f>>a[1];
	x[1]=a[1];
	l[1]=lmax=nr=1;
	for(i=2;i<=n;i++)
	{
		f>>a[i];
		poz=cautare(a[i],x);
		x[poz]=a[i];
		l[i]=poz;
		if(poz>nr)
		{
			nr++;
		}
		if(lmax<l[i])
		{
			lmax=l[i];
			k=i;
		}
	}
	g<<lmax<<'\n';
	afisare(k);
	return 0;
}