Pagini recente » Cod sursa (job #2460325) | Cod sursa (job #3187682) | Cod sursa (job #3188505) | Cod sursa (job #1304822) | Cod sursa (job #3195716)
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int CautBin(vector<int>& v, int val)
{
int st = 0, dr = v.size() - 1, poz = -1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (v[mij] >= val)
{
poz = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return poz;
}
int main()
{
int n;
fin >> n;
vector <int> v(n), dp, poz(n);
for (int i = 0; i < n; i++)
fin >> v[i];
dp.push_back(v[0]);
poz[0] = 0;
for (int i = 1; i < n; i++)
if (v[i] > dp.back()) {
dp.push_back(v[i]);
poz[i] = dp.size() - 1;
}
else {
int p = CautBin(dp, v[i]);
dp[p] = v[i];
poz[i] = p;
}
fout << dp.size() << "\n";
int p = 0;
for (int i = 1; i < n; i++)
if (poz[i] > poz[p])
p = i;
stack<int> sol;
sol.push(p);
for (int i = p - 1; i >= 0; i--)
if (poz[i] == poz[p] - 1 && v[i] < v[p])
{
sol.push(i);
p = i;
}
while (!sol.empty())
{
fout << v[sol.top()] << " ";
sol.pop();
}
return 0;
}