Pagini recente » Cod sursa (job #2438053) | Cod sursa (job #2167718) | Cod sursa (job #1928637) | Cod sursa (job #227366) | Cod sursa (job #2279998)
#include <iostream>
#include <fstream>
#include <stack>
#define N 100010
using namespace std;
int sol[N], ind, indices[N], input[N];
stack<int> solValues;
void binarySearch(int left, int right, int value)
{
if (right <= left)
{
ind = left;
return;
}
int middle = (left + right) / 2;
if (sol[middle] > value)
binarySearch(middle + 1, right, value);
binarySearch(left, middle - 1, value);
}
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int nr, solNr = 1;
fin >> nr >> input[1];
sol[1] = input[1];
indices[1] = 1;
for (int i=2; i<=nr; i++)
{
fin >> input[i];
if (input[i] > sol[solNr])
sol[++solNr] = input[i], indices[i] = solNr;
else
{
binarySearch(1, solNr, input[i]);
sol[ind] = input[i], indices[i] = ind;
}
}
for (int i=nr, ind=solNr; i>=1 && ind>=1; i--)
{
if (indices[i] == ind)
{
solValues.push(input[i]);
ind--;
}
}
fout << solNr << "\n";
while(!solValues.empty())
{
fout << solValues.top() << " ";
solValues.pop();
}
return 0;
}