Pagini recente » Cod sursa (job #574245) | Cod sursa (job #3275328) | Cod sursa (job #2676091) | Cod sursa (job #2945694) | Cod sursa (job #2977818)
#include <bits/stdc++.h>
using namespace std;
string np = "scmax";
ifstream f(np + ".in");
ofstream g(np + ".out");
// #define f cin
// #define g cout
int n, len;
// vector<stack<int>> lista(100003);
vector<pair<int, int>> topuri;
int cb(int nr)
{
int st = 1, dr = len, mid, rez = -1;
mid = (st + dr) / 2;
while (st <= dr)
{
mid = (st + dr) / 2;
if (nr <= topuri[mid].first)
rez = mid, dr = mid - 1;
else
st = mid + 1;
}
return rez;
}
int main()
{
f >> n;
vector<int> v(n + 1), ant(n + 1, -1);
for (int i = 1; i <= n; i++)
f >> v[i];
topuri.resize(n + 1);
for (int i = 1, poz; i <= n; i++)
{
poz = cb(v[i]);
if (poz == -1)
poz = len + 1, len = poz;
// lista[poz].push(v[i]);
topuri[poz] = {v[i], i};
ant[i] = topuri[poz - 1].second;
}
vector<int> rez;
for (int u = topuri[len].second; u; u = ant[u])
rez.push_back(v[u]);
reverse(rez.begin(), rez.end());
g << rez.size() << '\n';
for (auto x : rez)
g << x << " ";
return 0;
}