Cod sursa(job #1755676)

Utilizator MickeyTurcu Gabriel Mickey Data 10 septembrie 2016 19:19:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<string.h>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<unordered_map>
#include<array>
#include<deque>
#include<unordered_set>
#include<set>
#include<math.h>
using namespace std;
int i, j, n, v[100100],dp[100100],lft[100100],poz,nr,p[100100],maxim;
ifstream f("scmax.in");
ofstream g("scmax.out");
void print(int position)
{
	if (p[position] > 0)
		print(p[position]);
	g << v[position] << " ";
}
int cb(int el)
{
	int in, sf, mid;
	in = 0;
	sf = nr;
	mid = (in + sf) / 2;
	while (in <= sf)
	{
		if (v[lft[mid]] < el && v[lft[mid + 1]] >= el)
			return mid;
		else
			if (v[lft[mid + 1]] < el)
			{
				in = mid + 1;
				mid = (in + sf) / 2;
			}
			else
			{
				sf = mid - 1;
				mid = (in + sf) / 2;
			}
	}
	return nr;
}
int main()
{

	f >> n;
	for (i = 1; i <= n; i++)
		f >> v[i];
	dp[1] = lft[1] = 1;
	lft[0] = 0;
	nr = 1;
	for (i = 2; i <= n; i++)
	{
		poz = cb(v[i]);
		p[i] = lft[poz];
		dp[i] = poz + 1;
		lft[poz + 1] = i;
		if (nr < poz + 1)
			nr = poz + 1;
	}
	maxim = poz = 0;
	for(i=1;i<=n;i++)
		if (maxim < dp[i])
		{
			maxim = dp[i];
			poz = i;
		}
	g << maxim << "\n";
	print(poz);
	return 0;
}