Cod sursa(job #1089076)

Utilizator casuneanu.andreiCasuneanu Andrei Dan casuneanu.andrei Data 21 ianuarie 2014 14:45:55
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
//
//  main.cpp
//  subsir_crescator_maxima_n*log(n)
//
//  Created by Casuneanu Andrei on 21/01/14.
//  Copyright (c) 2014 Casuneanu Andrei. All rights reserved.
//

#include <fstream>
#define IN "scmax.in"
#define OUT "scmax.out"
#define DMAX 100008
using namespace std;

ifstream fin(IN);
ofstream fout(OUT);

int n;
int a[DMAX];
int best[DMAX];
int nbest;
int poz[DMAX];
int sir[DMAX];

void citire();
void showtime();
int cautare_binara(int[], int, int);
void afisare();

int main(int argc, const char * argv[])
{
	citire();
	showtime();
	afisare();
    return 0;
}

void afisare()
{
	int i;
	fout <<nbest<<'\n';
	for (i=1; i<=nbest; i++)
		fout <<sir[i]<<' ';
	fout <<'\n';
	fout.close();
}

void showtime()
{
	best[1]=a[1]; poz[1]=1; nbest=1;
	
	int i;
	int k;
	for (i=2; i<=n; i++)
	{
		if (a[i]>best[nbest]) {best[++nbest]=a[i]; poz[i]=nbest;}
		else
		{
			k=cautare_binara(best, nbest, a[i]);
			best[k]=a[i];
			poz[i]=k;
		}
	}
	
	int caut=nbest;
	for (i=n; i>0; i--)
		if (poz[i]==caut)
		{
			sir[caut]=a[i];
			caut--;
		}
}

int cautare_binara(int A[], int dim, int x)
{
	int hi=dim+1,lo =0, mid;
	while (hi-lo>1)
	{
		mid=(lo+hi)/2;
		if (A[mid]>x) hi=mid;
		else lo=mid;
	}
	if (hi == dim+1) return 0;
	return hi;
}

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