Pagini recente » Istoria paginii utilizator/pusneivictor | Diferente pentru utilizator/visuianmihai intre reviziile 61 si 60 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #755280)
Cod sursa(job #755280)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define nmax 100010
int a[nmax], p[nmax], q[nmax], maxim, poz, nr, n, b[nmax], nn;
int bs(int value, int left, int right)
{
int m;
while(left <= right)
{
m = (left + right) >> 1;
if(q[m] == value) return m;
else
if(q[m] > value) right = m - 1;
else left = m + 1;
}
return left;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i;
scanf("%i", &n);
for(i = 1; i <= n; i++) scanf("%i", &a[i]);
q[1] = a[1];
p[1] = 1;
nr = 1;
for(i = 2; i <= n; i++)
{
poz = bs(a[i], 1, nr);
if(poz > nr)
{
nr++;
q[nr] = a[i];
}
q[poz] = a[i];
p[i] = poz;
maxim = max(maxim, p[i]);
}
printf("%i\n", maxim);
for(i = n; i; i--)
{
if(p[i] == maxim && maxim != 0)
{
b[++nn] = a[i];
maxim --;
}
}
for(i = nn; i; i--) printf("%i ", b[i]);
return 0;
}