Cod sursa(job #597750)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 23 iunie 2011 10:08:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>
#include<algorithm>
using namespace std;
int n,v[100010],LIS[100010],poz[100010],lgmax;

void Citire()
{
	int i;
	ifstream fin("scmax.in");
	fin>>n;
	for(i=1;i<=n;i++)
		fin>>v[i];
	fin.close();
}

void Determinare_LIS()
{
	int i,pozitie;
	LIS[1]=v[1];
	poz[1]=1;
	lgmax=1;
	for(i=2;i<=n;i++)
	{
		pozitie=upper_bound(LIS+1,LIS+lgmax+1,v[i])-LIS;
		if(LIS[pozitie-1]==v[i])
			pozitie--;
		LIS[pozitie]=v[i];
		poz[i]=pozitie;
		if(pozitie>lgmax)
			lgmax=pozitie;
	}
}

void Afisare()
{
	int x,i,vector[100010],nr=0;
	ofstream fout("scmax.out");
	fout<<lgmax<<"\n";
	x=lgmax;
	for(i=n;i>0;i--)
	{
		if(poz[i]==x)
		{
			vector[++nr]=v[i];
			x--;
		}
	}
	for(i=nr;i>0;i--)
		fout<<vector[i]<<' ';
	fout<<"\n";
	fout.close();
}

int main()
{
	Citire();
	Determinare_LIS();
	Afisare();
	return 0;
}