Pagini recente » Cod sursa (job #1076326) | Cod sursa (job #2443195) | Cod sursa (job #115010) | Cod sursa (job #2932449) | Cod sursa (job #2172072)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100000 + 5;
stack <int> ans;
int n, lungime;
int v[NMAX];
int indice[NMAX], father[NMAX], sol[NMAX];
int bs(int ind)
{
int st = 1, dr = lungime, mijl, sol = 0;
while (st <= dr)
{
mijl = (st + dr) / 2;
if (v[ind] > v[indice[lungime]])
{
sol = mijl;
st = mijl + 1;
}
else
dr = mijl - 1;
}
return sol + 1;
}
void build_dp()
{
indice[1] = 1;
lungime = 1;
for (int i = 2; i <= n; ++i)
{
if (v[i] > v[indice[lungime]])
{
++lungime;
indice[lungime] = i;
father[i] = indice[lungime - 1];
}
else
{
int poz = bs(i);
indice[poz] = i;
father[i] = indice[poz - 1];
}
}
}
void build_ans()
{
int index = n;
while (index > 0)
{
ans.push(v[index]);
index = father[index];
}
}
void write()
{
fout << lungime << '\n';
while (!ans.empty())
{
fout << ans.top() << " ";
ans.pop();
}
}
void read()
{
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> v[i];
}
int main()
{
read();
build_dp();
build_ans();
write();
return 0;
}