Cod sursa(job #189138)

Utilizator alexeiIacob Radu alexei Data 12 mai 2008 12:10:41
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#define mx(a,b) ((a)>(b)?(a):(b))
#define nmax 100001

int a[nmax],poz[nmax],best[nmax],rebuild[nmax],limit,el;


void finish(int poz)
{
 if( rebuild[poz]>0 )
 finish( rebuild[poz] );
 
 printf("%d ",a[poz]);

}
inline int max(int a,int b,int poz)
{
 if( a>b )
 return a;
 el=poz;
 return b;
}

int search(int val)
{
int start=0,end=limit,mij;

    while( start<=end ){

       mij=(start+end)/2;
       
       if( a[ poz[mij] ]< val ){
        if( a[ poz[mij+1] ]>= val)
        return mij;
        else
        start=mij+1;
       }
       else
       end=mij-1;
       }

return limit;

}

int main()
{
 freopen("scmax.in","r",stdin);
 freopen("scmax.out","w",stdout);
 
 int N,solfin=0;
 int i,val;
 
 scanf("%d",&N);   
    
 for(i=1; i<=N; ++i)   
    scanf("%d",&a[i]);
 
 poz[1]=best[1]=1;
 
 for(i=2; i<=N; ++i){
 
 val=search( a[i] );
 best[i]=val+1;
 rebuild[i]=poz[val];
 poz[ val+1 ]=i;
 solfin=max(solfin,best[i],i); 
 limit=mx(limit,val+1);
    
 }   
    
 printf("%d\n",solfin);   
    
 finish(el);   
    
    return 0;
}