Pagini recente » Cod sursa (job #177246) | Cod sursa (job #583800) | Cod sursa (job #2080595) | Cod sursa (job #2752652) | Cod sursa (job #1898845)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NM = 100010;
int n, i, len, pos;
int best[NM], prv[NM], d[NM];
vector <int> alt;
int get_pos(int x) {
if (x == 1)
return x;
int lo = 1, hi = x;
while (lo <= hi) {
int mid = lo + (hi - lo)/2;
if (d[x] <= d[best[mid]]) {
hi = mid - 1;
pos = mid;
}
else if (d[best[mid]] == 0)
return mid;
else {
lo = mid + 1;
}
}
return pos;
}
int main()
{
in >> n;
for (i = 1; i <= n; ++i) {
in >> d[i];
}
for (i = 1; i <= n; ++i) {
pos = get_pos(i);
best[pos] = i;
if (pos == 1)
prv[best[pos]] = 0;
else
prv[best[pos]] = best[pos-1];
}
i = 1;
while (best[i]) i++;
len = i-1;
out << len << '\n';
len = best[len];
prv[0] = -12345;
while (prv[len] != prv[0]) {
alt.push_back(d[len]);
len = prv[len];
}
reverse(alt.begin(), alt.end());
for (auto &it: alt) {
out << it << ' ';
}
return 0;
}