Pagini recente » Cod sursa (job #2032257) | Cod sursa (job #1808868) | Cod sursa (job #16904) | Cod sursa (job #2840476) | Cod sursa (job #2485857)
#define NMAX 100005
#include <cstdio>
using namespace std;
int a[NMAX], v[NMAX], p[NMAX];
int n, lv, lmax, lg=1, vmax=0;
// caut binar in v unde il pun pe a[i]
int caut_bin(int x, int lg)
{
int i;
for(i=lv; lg!=0; lg>>=1)
if(i - lg >= 0 && v[i-lg] >= x)
i-=lg;
return i;
}
void read_formV()
{
// in p retin pozitiile din v ale tuturor elementelor din a
scanf("%d", &n);
for(int i=1; i<=n; ++i)
{
if(i > lg)
lg *= 2;
scanf("%d", &a[i]);
int poz = caut_bin(a[i], lg);
v[poz] = a[i];
if(poz == lv)
lv++;
p[i] = poz;
if(p[i] > p[vmax])
vmax = i;
}
}
int sol[NMAX];
void afis()
{
freopen("scmax.out", "w", stdout);
printf("%d\n", p[vmax]+1);
int val = p[vmax];
for(int i=vmax; i>=0 && val >= 0; --i)
if(p[i] == val)
{sol[val] = a[i]; --val;}
for(int i=0; i<=p[vmax]; ++i)
printf("%d ", sol[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
read_formV();
afis();
return 0;
}