Pagini recente » Cod sursa (job #528901) | Cod sursa (job #767090) | Cod sursa (job #934669) | Cod sursa (job #1098012) | Cod sursa (job #314158)
Cod sursa(job #314158)
#include<stdio.h>
#define NMAX 100002
int i,imax,n,lh,lr,a[NMAX],h[NMAX],hr[NMAX],v[NMAX],aib[NMAX],d[NMAX],p[NMAX],r[NMAX];
void mergesort(int l,int r) {
int mid=l+(r-l)/2,i,j,k;
if(l<r) {
mergesort(l,mid);
mergesort(mid+1,r);
i=k=l;
j=mid+1;
while((i<=mid)&&(j<=r))
if(a[h[i]]<a[h[j]]) hr[k++]=h[i++];
else hr[k++]=h[j++];
if(i>mid)
while(j<=r) hr[k++]=h[j++];
else
while(i<=mid) hr[k++]=h[i++];
for(i=l;i<=r;i++) h[i]=hr[i];
}
}
void vcalculate() {
int i,k=1;
for(i=1;i<=n;i++) h[i]=i;
mergesort(1,n);
v[h[1]]=1;
for(i=2;i<=n;i++)
if(a[h[i]]!=a[h[i-1]]) v[h[i]]=++k;
else v[h[i]]=k;
}
// begin - AIB operations
void update(int x,int ind) {
while(x<=n) {
if(d[ind]>d[aib[x]]) aib[x]=ind;
x+=x^(x-1)&x;
}
}
int query(int x) {
int max=0;
while(x) {
if(d[aib[x]]>d[max]) max=aib[x];
x-=x^(x-1)&x;
}
return max;
}
// end - AIB operations
// begin - I/O operations
void readfile() {
freopen("scmax.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
fclose(stdin);
}
void writefile() {
freopen("scmax.out","w",stdout);
printf("%d\n",lr);
for(int i=1;i<=lr;i++) printf("%d ",r[i]);
fclose(stdout);
}
// end - I/O operations
int main() {
readfile();
vcalculate();
d[0]=0;
for(i=1;i<=n;i++) {
p[i]=query(v[i]-1);
d[i]=d[p[i]]+1;
update(v[i],i);
}
imax=1;
for(i=2;i<=n;i++)
if(d[i]>d[imax]) imax=i;
lr=d[imax];
r[lr]=a[imax];
for(i=lr-1;i>0;i--) {
imax=p[imax];
r[i]=a[imax];
}
writefile();
return 0;
}