Pagini recente » Cod sursa (job #256311) | Cod sursa (job #951111) | Cod sursa (job #2674462) | Cod sursa (job #2748458) | Cod sursa (job #1550509)
#include <stdio.h>
#include <algorithm>
#define lsb(a) (a&-a)
using namespace std;
const int NMAX = 100005;
int bit[NMAX],A[NMAX],norm[NMAX],res[NMAX],b[NMAX],pre[NMAX];
int rs,n;
void update(int x, int val)
{
for(; x<=n; x+=lsb(x)){
if(b[val]>b[bit[x]])
bit[x]=val;
}
}
int query(int x)
{
int m=0;
for(; x; x-=lsb(x))
{
if(b[bit[x]] > b[m])
m=bit[x];
}
return m;
}
int main(void)
{
int h=1,i;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; ++i){
scanf("%d", &A[i]);
res[i] = norm[i] = A[i];
}
sort(norm+1, norm+n+1);
for(i=2; i<=n; ++i)
if(norm[i] != norm[h])
norm[++h] = norm[i];
for(i=1; i<=n; ++i)
A[i] = lower_bound(norm+1, norm+h+1, A[i]) - norm;
for(i=1; i<=n; ++i)
{
pre[i] = query(A[i]-1);
b[i] = b[pre[i]]+1;
update(A[i], i);
}
for(i=1; i<=n; ++i)
if(b[rs] < b[i])
rs=i;
printf("%d\n", b[rs]);
for(h=0, i=rs; i; i=pre[i])
norm[++h]=res[i];
for(i=h; i; --i)
printf("%d ", norm[i]);
printf("\n");
return 0;
}