Pagini recente » Cod sursa (job #288934) | Cod sursa (job #2848090) | Cod sursa (job #3190545) | Cod sursa (job #1119637) | Cod sursa (job #2486008)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, A[100005], X[100005], P[100005];
int maximum = -1, maxpos = -1;
int k_x;
stack <int> S;
void read()
{
fin >> n;
for (int i = 0; i < n; i++)
fin >> A[i];
}
int binarysearch(int st, int dr, int v)
{
if (st == dr)
return st;
int mij = (st + dr) / 2;
if (X[mij] == v)
return mij;
if (X[mij] < v)
return binarysearch(mij + 1, dr, v);
return binarysearch(st, mij, v);
}
void solve()
{
int currpos = 1;
X[0] = A[0];
for (int i = 1; i < n; i++)
{
int poz;
if (A[i] > X[currpos - 1])
{
poz = currpos;
currpos++;
}
else
poz = binarysearch(0, currpos - 1, A[i]);
X[poz] = A[i];
P[i] = poz;
if (poz > maximum)
{
maximum = poz;
maxpos = i;
}
}
}
void create_solution()
{
int aux_max = maximum;
for (int i = maxpos; i >= 0 && aux_max >= 0; i--)
if (P[i] == aux_max)
{
aux_max--;
S.push(A[i]);
}
}
void print_solution()
{
fout << maximum + 1 << "\n";
while (!S.empty())
{
fout << S.top() << " ";
S.pop();
}
}
int main()
{
read();
solve();
create_solution();
print_solution();
return 0;
}