Pagini recente » Cod sursa (job #392982) | Cod sursa (job #2772008) | Cod sursa (job #2509280) | Cod sursa (job #2160795) | Cod sursa (job #3218691)
#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], minEnd[MAX_N];
int32_t prev[MAX_N], 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];
int32_t maxLen = 0;
for(int32_t i = 0; i != n; ++i) {
int32_t len = maxLen;
for(int32_t step = MAX_N_POW_2; step; step >>= 1)
if(len >= step && vec[minEnd[len - step]] >= vec[i])
len -= step;
minEnd[len] = i;
if(len) {
prev[i] = minEnd[len - 1];
} else {
prev[i] = -1;
}
if(len + 1 > maxLen)
maxLen = len + 1;
}
int32_t top = 0;
for(int32_t i = minEnd[maxLen - 1]; i != -1; i = prev[i])
res[top++] = i;
fout << maxLen << '\n';
for(int32_t i = maxLen - 1; i != -1; --i)
fout << vec[res[i]] << ' ';
fin.close();
fout.close();
return 0;
}