Pagini recente » Cod sursa (job #3321760) | Cod sursa (job #3302247) | Cod sursa (job #3321758) | Monitorul de evaluare | Cod sursa (job #1615041)
#include <fstream>
#include <algorithm>
using namespace std;
const int MAX_N = 100000;
int Q[MAX_N]; // Q[i] = valoarea minima in care se poate termina un subsir de lungime i
int pos[MAX_N];
int redo[MAX_N];
int V[MAX_N];
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin.tie(0);
ios_base::sync_with_stdio(false);
int N; fin >> N;
int scm = 1;
for (int i = 0; i < N; ++ i) {
fin >> V[i];
if (V[i] > Q[scm - 1]) {
pos[i] = scm++;
} else {
pos[i] = lower_bound(Q, Q + scm, V[i]) - Q;
}
Q[pos[i]] = V[i];
}
fout << (--scm) << '\n';
int need = scm;
for (int i = N - 1; i >= 0; -- i) {
if (pos[i] == need) {
redo[--need] = V[i];
}
}
for (int i = 0; i < scm; ++ i) {
fout << redo[i] << " \n"[i == scm - 1];
}
fout << '\n';
fout.close();
return 0;
}