Pagini recente » Cod sursa (job #1319911) | Cod sursa (job #3266232) | Cod sursa (job #493692) | Cod sursa (job #2820427) | Cod sursa (job #3248166)
#include <fstream>
#include <stack>
using namespace std;
const int NMAX = 1e5 + 1;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[NMAX], d[NMAX], poz[NMAX], lg;
int cb(int x)
{
int st = 1, dr = lg, mij, sol = 0;
while(st <= dr)
{
mij = (st + dr) / 2;
if(d[mij] > x)
{
sol = mij;
dr = mij - 1;
}
else if(d[mij] < x)
st = mij + 1;
else
return 0;
}
d[sol] = x;
return sol;
}
int main()
{
int x;
fin >> n >> x;
d[++lg] = a[1] = x;
poz[1] = 1;
for(int i = 2; i <= n; ++i)
{
fin >> x;
if(x > d[lg])
{
d[++lg] = x;
poz[i] = lg;
}
else
poz[i] = cb(x);
a[i] = x;
}
stack<int> sol;
for(int i = lg, j = n; i > 0; --i)
{
while(poz[j] != i)
--j;
sol.push(j);
}
fout << sol.size() << '\n';
while(!sol.empty())
{
fout << a[sol.top()] << ' ';
sol.pop();
}
return 0;
}