Pagini recente » Cod sursa (job #374765) | Cod sursa (job #3313818) | Cod sursa (job #3314440) | Cod sursa (job #1034431) | Cod sursa (job #3313052)
#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;
}