Pagini recente » Cod sursa (job #1245409) | Cod sursa (job #2227196) | Diferente pentru implica-te/arhiva-educationala intre reviziile 71 si 223 | Cod sursa (job #1231391) | Cod sursa (job #174934)
Cod sursa(job #174934)
//Cel mai lung subsir crescator in N * log N
#include <stdio.h>
long n,i,x[100005],m[100005],p[100005],L,j;
long q,t,sol[100005];
int bSearch(long high,long val){
long low=0,mid;
while (low<high){
mid=(low+high)/2;
if (x[m[mid]]<val)
low=mid+1;
else high=mid;
}
return low-1;
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
scanf("%ld",&x[i]);
L=0;
m[0]=0;
for (i=1;i<=n;i++){
j=bSearch(L+1,x[i]);
p[i]=m[j];
if (j==L || x[i] < x [m[j+1]])
m[j+1]=i;
if (L<j+1)L=j+1;
}
printf("%ld\n",L);
sol[1]=x[m[L]];
q=1;
t=m[L];
while (t){
q++;
sol[q]=x[p[t]];
t=p[t];
}
for (i=L;i;i--)
printf("%ld ",sol[i]);
printf("\n");
return 0;
}