Cod sursa(job #2650723)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 19 septembrie 2020 21:03:14
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

using namespace std;

int numbers[100002], b[100002], parent[100002], best[100002];
int current_b;

void print_rec(int current) {
	if (current == 0)
		return;

	print_rec(parent[current]);
	printf("%d ", numbers[current]);
}


int bsearch(int current) {
	int l = 0, r = current_b, mid = (l + r) / 2;

	while (l < r) {
		if (numbers[b[mid]] < numbers[current] && numbers[b[mid+1]] >= numbers[current])
			return mid;

		if (numbers[b[mid+1]] < numbers[current])
			l = mid + 1;
		else
			r = mid - 1;
		mid = (l + r) / 2;
	}
    return current_b;
}


int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out" ,"w", stdout);

	int n, current_pos;
	scanf("%d", &n);
	for(int i=1; i<=n; ++i)
		scanf("%d", &numbers[i]);

    best[1] = b[1] = 1;

	for(int i=2; i<=n; ++i) {
		current_pos = bsearch(i);
		b[current_pos+1] = i;
		best[i] = current_pos + 1;
		parent[i]= b[current_pos];

		if (current_pos + 1 > current_b)
			current_b = current_pos + 1;
	}

	int max = 0;
	for(int i=1; i<=n; ++i)
		if (best[i] > best[max])
			max = i;

	printf("%d\n", best[max]);
	print_rec(max);

	return 0;
}