Pagini recente » Cod sursa (job #3274036) | Cod sursa (job #2881426) | Cod sursa (job #2492602) | Cod sursa (job #3160870) | Cod sursa (job #3132886)
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
std::ifstream in("scmax.in");
std::ofstream out("scmax.out");
struct nod {
int val;
nod *next = nullptr;
};
nod a[200001], *poz;
std::vector<std::stack<nod *>> v;
int main() {
int n;
in >> n;
poz = a;
in >> poz->val;
v.reserve(100001);
v.emplace_back();
v[0].emplace(poz);
for (int i = 2; i <= n; ++i) {
poz++;
in >> poz->val;
int st = 0, dr = v.size() - 1, p = -1;
while (st <= dr) {
int mij = (st + dr) / 2;
if (v[mij].top()->val >= poz->val)
dr = mij - 1, p = mij;
else
st = mij + 1;
}
if (p == -1) {
v.emplace_back();
v.back().emplace(poz);
v.back().top()->next = v[v.size() - 2].top();
} else {
v[p].emplace(poz);
if (p != 0)
v[p].top()->next = v[p - 1].top();
}
}
out << v.size() << "\n";
stack<int> r;
nod *pp = v.back().top();
while (pp != nullptr) {
r.emplace(pp->val);
pp = pp->next;
}
while (!r.empty())
out << r.top() << " ", r.pop();
return 0;
}