Cod sursa(job #572080)

Utilizator IsTeeSzasz Istvan IsTee Data 4 aprilie 2011 23:54:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream> 

int n, tomb[100003], p[100003], maximum, k, hosszusag[100003], szam; 

using namespace std;

ofstream g("scmax.out"); 
 
void kiiras(int i) {   
	if (p[i] > 0)  kiiras(p[i]); 
		g<<tomb[i]<<" "; 
}

int keres(int keresett) { 
	int elso, utolso, kozepso; 
	elso = 0; utolso = szam; kozepso = (elso+utolso)/2; 
	while (elso <= utolso) {      
		if (tomb[hosszusag[kozepso]] < keresett &&  tomb[hosszusag[kozepso+1]] >= keresett) return kozepso;      
		else if (tomb[hosszusag[kozepso+1]] < keresett) {elso = kozepso + 1; kozepso = (elso + utolso)/2;}     
				else {utolso = kozepso - 1; kozepso = (elso + utolso)/2;} 
	} 
	return szam; 
} 

int main(){  
	ifstream f("scmax.in"); 
	
	int i, j, pozicio, best[100003]={0}; 
	szam = 1; 
	f>>n; 
	for (i = 1; i <= n; i++) 
		f>>tomb[i];
	best[1] = hosszusag[1] = 1; hosszusag[0] =  0; 
	for (i = 2; i <= n; i++) { 
		pozicio = keres(tomb[i]); 
		p[i] = hosszusag[pozicio]; 
		best[i] = pozicio + 1; 
		hosszusag[pozicio + 1] = i; 
		if (szam < pozicio + 1)   szam = pozicio + 1; 
	} 
	maximum = 0; pozicio = 0; 
	for (i = 1; i <= n; i++) 
		if (maximum < best[i]) { 
			maximum = best[i]; pozicio = i; 
	} 
	g<<maximum<<'\n';    
	kiiras(pozicio);    
}