Cod sursa(job #2720739)

Utilizator FrostfireMagirescu Tudor Frostfire Data 11 martie 2021 11:18:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100000

using namespace std;

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

int n, k, v[NMAX+10], dp[NMAX+10], ans[NMAX+10];
vector <int> sol;

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

int main()
{	
	fin >> n;
	for(int i=1; i<=n; i++)
		fin >> v[i];
	dp[1] = v[1];
	k = 1;
	ans[1] = 1;
	for(int i=2; i<=n; i++)
		{	if(v[i] > dp[k])
				{	k++;
					dp[k] = v[i];
					ans[i] = k;
				}
			else
				{	int poz = binSearch(v[i]);
					dp[poz] = v[i];
					ans[i] = poz;
				}
		}
	fout << k << '\n';
	int i = n;
	while(k)
		{	if(ans[i] == k)
				{	sol.push_back(v[i]);
					k--;
				}
			i--;
		}
	for(int i=sol.size()-1; i>=0; i--)
		fout << sol[i] << ' ';
	fout << '\n';
	return 0;
}