Pagini recente » Cod sursa (job #800202) | Cod sursa (job #325172) | Cod sursa (job #1089266) | Cod sursa (job #1455425) | Cod sursa (job #1997902)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int L = 1 << 17;
int n, best, pre[100005], pos;
int v[100005];
vector<int> sol;
struct Item {
int val = 0, pos = 0;
} length[100005];
int cauta(int val) {
int step = L;
int p = 0;
while (step) {
if (p + step <= n && length[p + step].val < val) {
p += step;
}
step /= 2;
}
return p;
}
int main()
{
in >> n;
for (int i = 1; i <= n; ++i) {
in >> v[i];
length[i].val = 2e9 + 1;
}
for (int i = 1; i <= n; ++i) {
int l = cauta(v[i]);
l++;
if (length[l].val > v[i]) {
length[l].val = v[i];
pre[i] = length[l - 1].pos;
length[l].pos = i;
}
if (l > best) {
best = l;
pos = i;
}
}
out << best << "\n";
while (pos) {
sol.push_back(v[pos]);
pos = pre[pos];
}
for (int i = sol.size() - 1; i >= 0; --i) out << sol[i] << " ";
return 0;
}