Pagini recente » Cod sursa (job #1042201) | Cod sursa (job #169588) | Cod sursa (job #2974366) | Cod sursa (job #1804034) | Cod sursa (job #2568234)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, poz, maxim, ii;
int v[100001], pred[100001], lmax[100001], sol[100001], ind[100001];
int main()
{
in >> n;
for(int i = 1; i <= n; ++ i)
in >> v[i];
sol[1] = v[1];
ind[1] = 1;
lmax[1] = 1;
pred[1] = 0;
for(int i = 2; i <= n; ++ i)
{
if(v[i] > sol[maxim])
{
lmax[i] = maxim + 1;
sol[lmax[i]] = v[i];
ind[lmax[i]] = i;
pred[i] = ind[lmax[i] - 1];
}
else
{
poz = 0;
for(int j = (1<<29); j > 0; j /= 2)
if(poz + j <= maxim && sol[poz + j] <= v[i])
poz += j;
++poz;
sol[poz] = v[i];
ind[poz] = i;
pred[i] = ind[poz - 1];
}
// for(int k = 1; k <= lmax[i]; ++ k)
// cout << sol[k] << " ";
// cout << " " << lmax[i];
// cout << '\n';
maxim = max(maxim, lmax[i]);
}
maxim = 0;
for(int i = 1; i <= n; ++ i)
if(lmax[i] > maxim)
{
maxim = lmax[i];
poz = i;
}
out << maxim << '\n';
while(poz > 0)
{
sol[maxim - ii] = v[poz];
ii++;
poz = pred[poz];
}
for(int i = 1; i <= maxim; ++ i)
out << sol[i] << " ";
return 0;
}