Pagini recente » Borderou de evaluare (job #571884) | Borderou de evaluare (job #1533894) | Borderou de evaluare (job #3126642) | Borderou de evaluare (job #2068685) | Cod sursa (job #2412383)
//nlogn
#include <fstream>
#define maxN 100002
using namespace std;
int v[maxN], sol[maxN], lu[maxN];
int st, dr, mij, poz, k, n, i, j;
int main()
{
ifstream f("scmax.in");
ofstream g("scmax.out");
f >> n;
for(i = 1; i <= n; i ++)
f >> v[i];
for(i = 1; i <= n; i ++)
{
if(v[i] > sol[k])
{
sol[++ k] = v[i];
lu[i] = k;
}
else
{
st = 1, dr = k, poz = k;
while(st <= dr)
{
mij = (st + dr) / 2;
if(sol[mij] < v[i]) st = mij + 1;
else
{
dr = mij - 1;
poz = mij;
}
}
sol[poz] = v[i];
lu[i] = poz;
}
}
g << k << "\n";
for(i = n, j = 0; i > 0 && k; i --)
if(lu[i] == k)
{
sol[++ j] = v[i];
k --;
}
for(i = j; i >= 1; i --)
g << sol[i] << " ";
return 0;
}