Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #define NMAX 10000
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement