Pagini recente » Cod sursa (job #1569898) | Cod sursa (job #1777342) | Cod sursa (job #725943) | Cod sursa (job #2893025) | Cod sursa (job #2003753)
#include <vector>
#include <fstream>
#include <algorithm>
#define pb push_back
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> v;
vector<int> lic;
int getPotentialPrevElementIndex(vector<int> &initialVector, vector<int> &tails, int l, int r, int element) {
int m;
while (r - l > 1)
{
m = l + (r - l) / 2;
if (initialVector[tails[m]] >= element)
{
r = m;
}
else
{
l = m;
}
}
return r;
}
int n;
void print(vector<int> &parent, int pos) {
if (pos == -1) {
return;
}
print(parent, parent[pos]);
g << v[pos] << " ";
}
void solve()
{
if (v.size() == 0)
{
g << 0;
return;
}
vector<int> tailIndices(v.size(), 0);
vector<int> parent(v.size(), -1);
int length = 1;
int index = 0;
tailIndices[0] = 0;
for (int index = 1;index < v.size();index++)
{
if (v[index] < v[tailIndices[0]])
{
tailIndices[0] = index;
}
else if (v[index] > v[tailIndices[length - 1]])
{
parent[index] = tailIndices[length - 1];
tailIndices[length++] = index;
}
else
{
int poz = getPotentialPrevElementIndex(v, tailIndices, -1, length - 1, v[index]);
parent[index] = tailIndices[poz - 1];
tailIndices[poz] = index;
}
}
g << length << '\n';
/*for (int i = tailIndices[length - 1]; i >= 0; i = parent[i])
g << v[i] << " ";*/
print(parent, tailIndices[length - 1]);
}
int main()
{
int el;
f >> n;
for (int i = 0; i <= n; i++)
{
f >> el;
v.pb(el);
}
solve();
return 0;
}