Pagini recente » Cod sursa (job #887376) | Cod sursa (job #2343509) | Cod sursa (job #1905054) | Cod sursa (job #868615) | Cod sursa (job #2552345)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, lmax, nr;
int v[100001], sol[100001], want[100001];
void copySol() {
for (int i = 1; i <= lmax; i++)
sol[i] = v[i];
}
int main() {
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> nr;
int st = 1, dr = lmax;
while (st < dr) {
int m = (st + dr + 1) / 2;
if (nr >= v[m])
st = m;
else
dr = m - 1;
}
if (lmax == 0) {
lmax++;
v[lmax] = nr;
copySol();
} else {
while (nr > v[st] && st < lmax)
st++;
if (st != lmax)
while (want[st] && nr > want[st] && st < lmax)
st++;
if (st == lmax)
for (int i = lmax; i >= 1 && want[i] != 0; i--) {
v[i] = want[i];
want[i] = 0;
}
if (nr > v[st]) {
lmax++;
v[lmax] = nr;
copySol();
} else {
want[st] = nr;
}
}
}
fout << lmax << '\n';
for (int i = 1; i <= lmax; i++)
fout << sol[i] << ' ';
return 0;
}