Cod sursa(job #1975342)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 30 aprilie 2017 16:08:38
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
									
ifstream f("scmax.in");
ofstream g("scmax.out");

int binsearch(int v[], vector<int> &T, int l, int r, int val)
{
	int mid;
	while (l < r)
	{
		mid = (l + r) / 2;
		if (v[T[mid]] < val)
			l = mid + 1;
		else
			r = mid - 1;
	}
	return mid;

}

void LIS(int v[], int n)
{
	vector <int> lowest(n, 0);
	vector <int> prevIndex(n, -1);
	int len = 1;

	for (int i = 1; i < n; i++)
	{
		//if current element is lower than the lowest
		if (v[i] < v[lowest[0]])
			lowest[0] = i;
		//if current element is bigger than the biggest add it to subsequence
		else if (v[i] > v[lowest[len - 1]])
		{
			prevIndex[i] = lowest[len - 1];
			lowest[len++] = i;
		}
		else
		{
			//search the lowest element that is bigger than v[i](current el) and change it with v[i]
			int pos = binsearch(v, lowest, 0, len - 1, v[i]);
			lowest[pos] = i;
			prevIndex[i] = prevIndex[pos];

		}
	}

	g << len << endl;

	vector <int> reverse;

	for (int i = lowest[len - 1]; i >= 0; i = prevIndex[i])
		reverse.push_back(v[i]);
		//g << v[i] << " ";
	for (int i = len - 1; i >= 0; i--)
		g << v[i] << " ";
}

int main()
{
	int n;
	int v[100000];
	f >> n;

	for (int i = 0; i < n; i++)
	{
		f >> v[i];
	}

	LIS(v, n);

	char t;
	cin >> t;
}