Cod sursa(job #2568621)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 4 martie 2020 08:47:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda r3capitusulare Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 1e5 + 1;

int v[DIM];
int pos[DIM];
int from[DIM];

main()
{
	int n;
	fin >> n;
	
	for(int i = 1; i <= n; ++i)
	{
		fin >> v[i];
	}
	
	int siz = 1;
	pos[1] = 1;
	
	for(int i = 2; i <= n; ++i)
	{
		int l = 1;
		int r = siz;
		
		int ans = 0;
		
		while(l <= r)
		{
			int mid = (l + r) / 2;
			
			if(v[pos[mid]] < v[i])
			{
				ans = mid;
				l = mid + 1;
			}
			else
			{
				r = mid - 1;
			}
		}
		
		ans++;
		
		if(ans > siz)
			++siz;
		
		pos[ans] = i;
		from[i] = pos[ans - 1];
	}
	
	vector <int> sir;
	int p = pos[siz];
	
	while(p)
	{
		sir.emplace_back(p);
		p = from[p];
	}
	
	reverse(sir.begin(), sir.end());
	
	fout << siz << '\n';
	for(auto i : sir)
		fout << v[i] << ' ';
}