Pagini recente » Cod sursa (job #1717229) | Cod sursa (job #2929400) | Cod sursa (job #2941062) | Cod sursa (job #222622) | Cod sursa (job #600108)
Cod sursa(job #600108)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 100005
int T[MAXN], A[MAXN], P[MAXN], IND[MAXN], B[MAXN], L[MAXN], N;
void Update(int x, int ind){
for( ; x<=N; x+=x^(x-1) & x)
if(L[ind] > L[T[x]])
T[x]=ind;
}
int Query(int x){
int r=0;
for( ; x; x-=x^(x-1) & x)
if(L[r] < L[T[x]])
r=T[x];
return r;
}
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i, cnt, maxp;
scanf("%d", &N);
for(i=1; i<=N; i++){
scanf("%d", A+i);
IND[i]=A[i];
}
sort(IND+1, IND+N+1);
cnt=1;
for(i=2; i<=N; i++)
if(IND[i] != IND[cnt])
IND[++cnt]=IND[i];
for(i=1; i<=N; i++)
B[i]=lower_bound(IND+1, IND+cnt+1, A[i])-IND;
memset(T, 0, sizeof(T));
L[0]=0;
for(i=1; i<=N; i++){
P[i]=Query(B[i]-1);
L[i]=L[P[i]]+1;
Update(B[i], i);
}
maxp=0;
for(i=1; i<=N; i++)
if(L[maxp] < L[i])
maxp=i;
printf("%d\n", L[maxp]);
for(cnt=0, i=maxp; i; i=P[i])
IND[++cnt]=A[i];
for(i=cnt; i; i--)
printf("%d ", IND[i]);
printf("\n");
return 0;
}