Cod sursa(job #2655459)

Utilizator PaulTPaul Tirlisan PaulT Data 4 octombrie 2020 14:14:44
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

using VI = vector<int>;

ofstream fout("scmax.out");
int n, k;
VI a, v, t;

void Read();
void Solve();
void Write(int pos);

int main()
{
	Read();
	Solve();
	fout << k << '\n';
	Write(v[k]);
}

void Solve()
{
	v.emplace_back(-1);
	for (int i = 0; i < n; i++)
	{
		if (!k || a[i] > a[v[k]])
		{
			t[i] = v[k];
			k++;
			v[k] = i;
		}
		else
		{
			int left = 1, right = k, mid, j;
			while (left <= right)
			{
				mid = (left + right) / 2;
				if (a[v[mid]] >= a[i])
				{
					j = mid;
					right = mid - 1;
				}
				else
					left = mid + 1;
			}
			
			t[i] = v[j - 1];
			v[j] = i;
		}
	}
}

void Write(int pos)
{
	if (pos < 0) return;
	
	Write(t[pos]);
	fout << a[pos] << ' ';
}

void Read()
{
	ifstream fin("scmax.in");
	fin >> n;
	a = t = VI(n);
	for (int i = 0; i < n; i++)
		fin >> a[i];
}