Cod sursa(job #314158)

Utilizator mlazariLazari Mihai mlazari Data 10 mai 2009 18:55:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#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;
}