Pagini recente » Cod sursa (job #2114987) | Cod sursa (job #2760557) | Cod sursa (job #1026417) | Cod sursa (job #1296667) | Cod sursa (job #2693555)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 100005;
int n;
vector<int> a, d, p, sol;
int main()
{
int i, k = 1, x;
fin>>n;
a.push_back(0);
for(i = 1; i <= n; ++i)
{
fin>>x;
a.push_back(x);
}
p.assign(n + 1, 0);
d.push_back(0);
p[1] = 1;
d.push_back(a[1]);
for(i = 1; i <= n; ++i)
{
if(a[i] > d[k])
{
++k;
d.push_back(a[i]);
p[i] = k;
}
else
{
if(a[i] < d[1])
{
d[1] = a[i];
p[i] = 1;
}
else
{
int st = 1, dr = k, mij, poz = k + 1;
while(st <= dr)
{
mij = (st + dr) / 2;
if(a[i] <= d[mij])
{
poz = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
d[poz] = a[i];
p[i] = poz;
}
}
}
fout<<k<<'\n';
int copie_k = k;
for(i = n; i > 0; --i)
{
if(p[i] == k)
{
sol.push_back(a[i]);
--k;
}
}
for(vector<int> :: reverse_iterator it = sol.rbegin(); it != sol.rend(); ++it)
fout<<*it<<' ';
return 0;
}