Cod sursa(job #708871)

Utilizator ion824Ion Ureche ion824 Data 7 martie 2012 13:26:48
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
#define inf 2000000010
#define nmax 100005
int a[nmax],q[nmax],p[nmax],s[nmax],n,len;

void readdata(){
      freopen("scmax.in","r",stdin); 
      scanf("%d\n",&n);  
      for(int i=1;i<=n;++i)scanf("%d ",&a[i]);
     }

int insert(int k,int lo,int hi){
     int mid=(lo+hi)/2;
         if(lo==hi){
                    if(hi>len)q[++len+1]=inf;
                    q[lo]=k;
                    return lo;
                    }
                    else if(k<q[mid])return insert(k,lo,mid); 
                                else return insert(k,mid+1,hi);
     }

void buildPQ(void){
     int place,i;
     len=0; q[1]=inf;
     for(i=1;i<=n;++i)
                  p[i]=insert(a[i],1,len+1);                                                                   
     }
     
void buildS(void){
     int i,k=n;
     for(i=len;i;i--)
     {
                     while(p[k]!=i)k--;
                     s[i]=a[k];
     }
}     

void WriteSolution(void){
     freopen("scmax.out","w",stdout);
     printf("%d\n",len);
     for(int i=1;i<=len;++i)printf("%d ",s[i]);
}

int main(void){
    readdata();   
    buildPQ();
    buildS();
    WriteSolution();
 return 0;   
}