Cod sursa(job #752566)

Utilizator Stefana_fFratean Stefana Stefana_f Data 28 mai 2012 21:40:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 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]=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;
}