Cod sursa(job #708803)

Utilizator ion824Ion Ureche ion824 Data 7 martie 2012 11:04:03
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<cstdio>
#define nmax 100005
int a[nmax],arb[4*nmax+50],val[4*nmax+50],d[4*nmax+50];
int pos,v,l,start,finish,dd;

void update(int nod,int left,int right)
{
  if(left == right)
          {
            arb[nod]=l;
            val[nod]=v;
            return ;
          }     
   int div=(left+right)/2;
   if(pos<=div)update(2*nod,left,div);
           else update(2*nod+1,div+1,right);  
    if(arb[2*nod]>arb[2*nod+1]){ arb[nod]=arb[2*nod]; val[nod]=val[2*nod]; }
       else { arb[nod]=arb[2*nod+1]; val[nod]=val[2*nod+1]; }            
}

void query(int nod,int left,int right)
{
  if(left == right){
          if(arb[nod]>l && val[nod]>v){ l=arb[nod]; dd=nod; }
          return ;
          }
   int div=(left+right)/2;
   
   if(left == pos && arb[nod]>l && val[nod]>v){ l=arb[nod]; dd=nod; return ; }
   
   if(pos<=div){ 
                 query(2*nod,left,div);
                 if(arb[2*nod+1]>l){
                                    if(val[2*nod+1]>v){ l=arb[2*nod+1]; return ; }
                                     else query(2*nod+1,div+1,right);
                                    }
                 }
    else query(2*nod+1,div+1,right);           
}

/*void scrie(int nod,int left,int right){
     if(left == right){
             v=val[nod];
             return ;
             }
     int div=(left+right)/2;
     
     if(arb[2*nod]==arb[nod])scrie(2*nod,left,div);
       else scrie(2*nod+1,div+1,right);
     
     if(val[d[nod]]>v){ printf("%d ",v); v=val[d[nod]]; }
     }*/



int main(void){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,j;
    scanf("%d\n",&n);
    for(i=1;i<=n;++i)scanf("%d ",&a[i]);
    l=1; v=a[n]; pos=n;
    update(1,1,n);
    for(i=n-1;i>=1;--i){
                        
                  l=0; v=a[i]; pos=i+1; start=pos+1; finish=n; dd=0;   
                  query(1,1,n);  
                  d[i]=dd;   
                  l++; pos--; start=pos;
                  update(1,1,n);       
                        }
    printf("%d\n",arb[1]);
   /* scrie(1,1,n);*/
 return 0;   
}