Pagini recente » Cod sursa (job #2909458) | Borderou de evaluare (job #1078739) | Borderou de evaluare (job #214629) | Borderou de evaluare (job #2680544) | Cod sursa (job #2985807)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int maxN = 100000;
int a[maxN + 1], n;
int L[maxN + 1];
int best[maxN + 1];
int t[maxN + 1];
int lmax, lg, k;
inline int cb(int x) {
int lb = 0, rb = lg;
while (lb <= rb) {
int mb = lb + (rb - lb) / 2;
if (a[L[mb]] < x && a[L[mb + 1]] >= x) {
return mb;
} else if (a[L[mb + 1]] < x) {
lb = mb + 1;
} else {
rb = mb - 1;
}
}
return lg;
}
void afis(int i) {
if (t[i] > 0) afis(t[i]);
fout << a[i] << ' ';
}
int main() {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
L[1] = best[1] = 1;
lg = 1;
for (int i = 2; i <= n; ++i) {
k = cb(a[i]);
t[i] = L[k];
best[i] = k + 1;
L[k + 1] = i;
lg = max(lg, k + 1);
}
k = 0;
for (int i = 1; i <= n; ++i) {
if (lmax < best[i]) {
lmax = best[i], k = i;
}
}
fout << lmax << '\n';
afis(k);
}