Pagini recente » Cod sursa (job #1576968) | Cod sursa (job #2800345) | Cod sursa (job #415622) | Cod sursa (job #370056) | Cod sursa (job #218943)
Cod sursa(job #218943)
#include <stdio.h>
#define NMAX 100010
#define INFI 0x3f3f3f3f
int a[NMAX];
int v[NMAX];
int max;
int n;
int nr;
int last[NMAX];
int list[NMAX], h = 0;
int bs(int x)
{
int m, st = 1, dr = nr+1;
while(st <= dr)
{
m = (st+dr) >> 1;
if(a[ v[m] ] >= a[x] && a[ v[m-1] ] < a[x])
return m;
else if(a[ v[m] ] < a[x])
st = m+1;
else
dr = m-1;
}
return m;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d\n", &n);
for(int i = 1; i <= n; ++i)
scanf("%d ", &a[i]);
a[0] = INFI;
v[1] = 1;
nr = 1;
for(int crt, i = 2; i <= n; ++i)
{
crt = bs(i);
//printf("m = %d\n", crt); continue;
if(a[ v[crt] ] == INFI)
++nr;
v[crt] = i;
last[i] = v[crt-1];
}
printf("%d\n", nr);
for(int i = v[nr]; i != 0; i = last[i])
list[++h] = i;
for(int i = h; i; --i)
printf("%d ", a[ list[i] ]);
return 0;
}