Pagini recente » Cod sursa (job #2439685) | Cod sursa (job #1531834) | Cod sursa (job #1813974) | Cod sursa (job #2677446) | Cod sursa (job #1166381)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N = 100100;
#define len(x) int((x).size())
int N;
int v[MAX_N];
int p[MAX_N];
void read();
void scmax();
void rebuild(int pos);
int main() {
read();
scmax();
return 0;
}
void read() {
fin >> N;
for (int i = 1; i <= N; i += 1)
fin >> v[i];
}
void scmax() {
vector<int> l;
l.push_back(0);
for (int i = 1, p2 = 1, pos; i <= N; i += 1) {
while ((p2 << 1) < len(l)) p2 <<= 1;
pos = 0;
for (int step = p2; step; step >>= 1)
if (pos + step < len(l) && v[l[pos + step]] < v[i])
pos += step;
if (pos == len(l) - 1) l.push_back(0);
p[i] = l[pos];
l[pos + 1] = i;
}
fout << len(l) - 1 << '\n';
rebuild(l.back());
}
void rebuild(int pos) {
if (pos == 0) return;
rebuild(p[pos]);
fout << v[pos] << ' ';
}