Pagini recente » Istoria paginii runda/hlo_10_vacanta/clasament | tema | Clasamentul arhivei de probleme | Cod sursa (job #2526724)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#define NMAX 100010
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[NMAX], N, lis[NMAX], pred[NMAX], L, sir[NMAX];
void read() {
fin >> N;
for (int i = 0; i < N; ++i) {
fin >> v[i];
}
}
void getScmax() {
L = 0;
lis[0] = 0;
for (int i = 1; i <= N + 5; ++i) {
lis[i] = 99999999;
}
for (int i = 0; i < N; ++i) {
int left = 1, right = L;
while (left <= right) {
int mij = (left + right) / 2;
if (v[lis[mij]] < v[i]) {
left = mij + 1;
}
else {
right = mij - 1;
}
}
int newL = left;
pred[i] = lis[newL - 1];
lis[newL] = i;
if (newL > L)
L = newL;
}
int j = lis[L];
for (int i = L; i > 0; --i) {
sir[i] = j;
j = pred[j];
}
}
int main() {
read();
getScmax();
fout << L << "\n";
for (int i = 1; i <= L; ++i) {
fout << v[sir[i]] << " ";
}
return 0;
}