Cod sursa(job #2484632)

Utilizator Iulia25Hosu Iulia Iulia25 Data 31 octombrie 2019 11:54:33
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.73 kb
#include <fstream>

using namespace std;

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

int n, k;
int dp[100005], v[100005], a[100005], PREV[100005], ans[100005];

int bs(int val)	{
	int st = 1, dr = k, mij, ans = 0;
	while (st <= dr)	{
		mij = (st + dr) / 2;
		if (a[v[mij]]< val)	{
			st = mij + 1;
			ans = mij;
		} else
			dr = mij - 1;
	}
	return ans;
}

int main()	{
	fin >> n;
	for (int i = 1; i <= n; ++i)	{
		fin >> a[i];
		int j = bs(a[i]);
		dp[i] = j + 1;
		if (j == k)
			v[++k] = i;
		else if (a[v[j + 1]] > a[i])
			v[j + 1] = i;
		PREV[i] = v[j];
	}
	int poz = v[k];
	k = 0;
	while (poz)	{
		ans[++k] = a[poz];
		poz = PREV[poz];
	}
	fout << k << '\n';
	for (int i = k; i; --i)
		fout << ans[i] << ' ';
	return 0;
}