Cod sursa(job #2105258)

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

using namespace std;

int a[NMAX], n;
int lung[NMAX], 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, pos, posMax = 0;

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

		pos = binary(1, maxL, a[i]);
		
		lung[i] = lung[pos] + 1;
		pred[i] = pos;

		if (lung[i] == maxL + 1 || a[i] < a[l[lung[i]]])
			l[lung[i]] = i;

		if (lung[i] == maxL + 1)
			maxL++;

		if (lung[posMax] < lung[i])
			posMax = i;
	}
	
	out << lung[posMax] << "\n";
	print(posMax);
	out.close();
	return 0;
}