Cod sursa(job #276233)

Utilizator katakunaCazacu Alexandru katakuna Data 10 martie 2009 23:26:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>
#include<algorithm>
#define NMAX 100111
using namespace std;

int p,u,lg,lgmax,i,n,m[NMAX],v[NMAX],t[NMAX];
FILE *g = fopen("scmax.out","w");

int binar(int x){

	int mij;
	p = 1, u = lgmax;
	while( p <= u){
		mij = (p + u) >> 1;
		if( v[m[mij]] >= x )
			u = mij - 1;
		else
			p = mij + 1;
	}
	
	return u;
}

void reconst(int x){
	if(!t[x])
		fprintf(g,"%d ",v[x]);
	
	else{
		reconst(t[x]);
		fprintf(g,"%d ",v[x]);
	}
}

int main(){

	FILE *f = fopen("scmax.in","r");
	
	fscanf(f,"%d",&n);
	for(i=1; i<=n; i++)
		fscanf(f,"%d",&v[i]);
	
	for(i=1; i<=n; i++){
		lg = binar(v[i]) + 1;
		
		if(!m[lg] || v[m[lg]] > v[i])
			m[lg] = i;
		
		t[i] = m[lg - 1];
		lgmax = max(lgmax, lg);
	}
	
	fprintf(g,"%d\n",lgmax);
	reconst( m[lgmax] );
	
	fclose(f);
	fclose(g);
	
	return 0;

}