Cod sursa(job #2105268)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 12 ianuarie 2018 22:34:28
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
#define NMAX 100001

using namespace std;

int a[NMAX], n;
int pred[NMAX];
int l[NMAX];

void read() {

	ifstream in("scmax.in");
	in >> n;

	for (int i = 1; i <= n; i++)
		in >> a[i];

	in.close();
}

int binary(int left, int right, int value) {

	int mid;
	while (left <= right) {

		mid = left + (right - left) / 2;

		if (a[l[mid]] < value && (a[l[mid + 1]] >= value || mid == right))
			return l[mid];

		if (a[l[mid]] >= value)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return 0;
}

ofstream out("scmax.out");

void print(int i) {

	if (i != 0) {

		print(pred[i]);
		out << a[i] << " ";
	}
}

int main() {

	read();

	int maxL = 0, len;

	for (int i = 1; i <= n; i++) {

		len = binary(1, maxL, a[i]);
		
		pred[i] = l[len];

		if (l[len + 1] == 0 || a[l[len + 1]] > a[i])
			l[len + 1] = i;

		if (len + 1 > maxL)
			maxL = len + 1;
	}
	
	out << maxL << "\n";
	print(l[maxL]);
	out.close();
	return 0;
}