Cod sursa(job #1254348)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 2 noiembrie 2014 16:08:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");

const int nmax = 100006;
int n, v[nmax], d[nmax], best[nmax], lbest = 1, duv[nmax];

int bs(int x)
{
	int hi = lbest, lo = 0, mid = 0;
	while(hi - lo>1)
	{
		mid = (hi + lo) / 2;

		if(v[best[mid]]>=x && x>v[best[mid - 1]])
			return mid;

		if(v[best[mid]]>=x)
			hi = mid;
		else
			lo = mid;
	}

	if(v[best[mid]]>=x && x>v[best[mid - 1]])
			return mid;
	if(v[best[lo]]>=x && x>v[best[lo - 1]])
			return lo;
	if(v[best[hi]]>=x && x>v[best[hi - 1]])
			return hi;

	return  -1;
}

int main(){
	int player_unu=0;

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

		int aux = bs(v[i]);

		if(aux==-1)
		{
			best[lbest] = i;
			duv[i] = best[lbest - 1];
			lbest++;
		}
		else
		{
			best[aux] = i;
			duv[i] = best[aux - 1];
		}
	}

	out<<lbest - 1<<'\n';
	int ceafisam = best[lbest - 1];
	for(int i = 1; i<=lbest - 1; i++)
	{
		d[i] = v[ceafisam];
		ceafisam = duv[ceafisam];
	}

	for(int i = lbest - 1; i>=1; i--)
		out<<d[i]<<' ';

	return player_unu;
}