Cod sursa(job #226730)

Utilizator mihnea_andreiMihnea Andrei mihnea_andrei Data 2 decembrie 2008 18:32:42
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream> 
#define N 100005

using namespace std;  

int v[N],x[N],pred[N],lung[N],n,m; 

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

int caut (int a) 
{ 
	int s=1,d=m,mij; 
	while (s!=d) 
	{ 
		mij=(s+d)/2; 
		if(a<=v[x[mij]]) 
			d=mij; 
		else 
			s=mij+1; 
	}
	if(v[x[s]]<a)
		++s;
	return s;
}

void citire ()
{ 
	in>>n; 
	for(int i=1;i<=n;i++) 
		in>>v[i]; 
} 

int maxim () 
{ 
	int i,m=1; 
	for(i=1;i<=n;i++) 
	{		
		if(lung[m]<lung[i]) 
			m=i; 
	}  
	return m; 
} 
	
void subsir (int p) 
{ 
	if(p==0) return; 
	subsir(pred[p]); 
	out<<v[p]<<" "; 
} 

void parcurg ()
{ 
	int i,poz;
	x[1]=1; 
	pred[1]=0; 
	lung[1]=1; 
	m=1;
	for(i=2;i<=n;++i)
	{
		poz=caut(v[i]);//x[poz]=pozitia celui mai mic elem din v care a fost deja prelucrat si este mai mare ca v[i]
		x[poz]=i; 
		lung[i]=poz; 
		pred[i]=x[poz-1]; 
		if(poz==m+1) 
			m++; 
	} 
	out<<m<<"\n";
	poz=maxim();
	subsir(poz);
}
	
int main () 
{ 
	citire ();
	parcurg(); 
	in.close(); 
	out.close();
	return 0; 
}