Cod sursa(job #1972099)

Utilizator Robert29FMI Tilica Robert Robert29 Data 21 aprilie 2017 21:35:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<fstream>
#define N 100001
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");

int v[N], w[N], t[N];

int* Solve(int v[], int n)
{
    int* sol = new int[n +1];
	w[0] = w[1] = 1;

	for(int i = 2; i <= n; ++i)
	{
		int first = 1, last = w[0];
		while(first <= last)
		{
			int mid = (first + last) / 2;
			if(v[w[mid]] < v[i])
			{
				first = mid + 1;
			}
			else
			{
				last = mid - 1;
			}
		}

		w[first] = i;
		if(first > w[0])
		{
			w[0] = first;
		}
		t[i] = w[last];
	}

	int last = w[w[0]];

	for(int i = 1; i <= w[0]; ++i)
	{
		sol[i] = v[last];
		last = t[last];
	}
	return sol;
}

int main(){
	int n;
	cin >> n;

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

	int *sol;
	sol = Solve(v, n);

	cout << w[0] << endl;

	for(int i = w[0]; i; --i)
	{
		cout << sol[i] << " ";
	}

	cin.close();
	cout.close();
	return 0;
}