Cod sursa(job #1936648)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 23 martie 2017 11:40:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <climits>
#define INF INT_MAX

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

void ins(int x);

int n, lg, cautat, v[100005], poz[100005], sir[100005], sol[100005];

//sir[i] = cel mai mic numar care poate sta pe pozitia i in subsirul crescator

int main()
{
	int i;

	fin >> n;
	sir[1] = INF;
	for (i = 1; i <= n; i++)
	{
		fin >> v[i];
		ins(i);
	}
	fout << lg << '\n';
	cautat = lg;
	i = n;
	while (cautat)
	{
		if (poz[i] == cautat)
		{
			sol[cautat] = i;
			cautat--;
		}
		i--;
	}
	for (i = 1; i <= lg; i++)
		fout << v[sol[i]] << ' ';
	fout << '\n';
	return 0;
}

void ins(int i)
{
	int st, dr, mij, x=v[i];

	st = 1;
	dr = lg + 1;
	while (st < dr)
	{
		mij = (st + dr) / 2;
		if (x <= sir[mij])
			dr = mij;
		else st = mij + 1;
	}
	if (st > lg)
	{
		lg++;
		sir[lg + 1] = INF;
	}
	sir[st] = x;
	poz[i] = st;
}