Cod sursa(job #3313052)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 1 octombrie 2025 22:55:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

const int32_t MAX_N = 100000;
const int32_t MAX_N_POW_2 = 1 << 16;

int32_t vec[MAX_N];
int32_t stack[MAX_N], top = 0;
int32_t prev[MAX_N];
int32_t res[MAX_N];

int main() {
	std::ifstream fin("scmax.in");
	std::ofstream fout("scmax.out");

	int32_t n;
	fin >> n;
	for(int32_t i = 0; i != n; ++i)
		fin >> vec[i];
	
	for(int32_t i = 0; i != n; ++i) {
		int32_t len = -1;
		for(int32_t step = MAX_N_POW_2; step; step >>= 1) {
			if(len + step < top && vec[stack[len + step]] < vec[i])
				len += step;
		}

		if(len != -1) {
			prev[i] = stack[len];
		} else {
			prev[i] = -1;
		}
		++len;
		if(len != top) {
			if(vec[i] < vec[stack[len]])
				stack[len] = i;
		} else {
			stack[top++] = i;
		}
	}

	int32_t len = top;
	for(int32_t i = len - 1, ind = stack[len - 1]; i != -1; --i) {
		res[i] = vec[ind];
		ind = prev[ind];
	}

	fout << len << '\n';
	for(int32_t i = 0; i != len; ++i)
		fout << res[i] << ' ';

	fin.close();
	fout.close();

	return 0;
}