Cod sursa(job #2966822)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 18 ianuarie 2023 15:42:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
using namespace std;
string file = "scmax";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
const int N = 100000;
int x[N + 1], n, val_min[N + 1], lung[N + 1];

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

int caut_bin(int dr, int val)
{
	int st = 1, rez = 0;
	while (st <= dr)
	{
		int mid = (st + dr) / 2;
		if (val_min[mid] < val)
		{
			rez = mid;
			st = mid + 1;
		}
		else
		{
			dr = mid - 1;
		}
	}
	return rez;
}

void afisare(int l, int i)
{
	if (l == 0)
		return;
	for (; i >= 1; i--)
	{
		if (lung[i] == l)
		{
			afisare(l - 1, i-1);
			cout << x[i] << ' ';
			break;
		}
	}
}
int main()
{
	int n_val_min = 0, l_max(0);
	citire();
	for (int i = 1; i <= n; i++)
	{
		int j0 = caut_bin(n_val_min, x[i]);
		if (j0 == n_val_min)
			n_val_min++;
		lung[i] = 1 + j0;
		val_min[1 + j0] = x[i];
		l_max = max(l_max, lung[i]);
	}
	cout << l_max << endl;
	afisare(l_max,n);
}