Cod sursa(job #280912)

Utilizator igsifvevc avb igsi Data 13 martie 2009 17:31:32
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream.h>

#define xx 100001

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int h[5*xx],v[xx],l[xx],n,poz,a,b,max;

void creare_arb(int nd,int li,int ls)
{
     if(li==ls)
     {
       h[nd]=poz;
       return;
     }
     int mij=(li+ls)/2;
     
     if(poz<=mij)
        creare_arb(2*nd,li,mij);
     else
        creare_arb(2*nd+1,mij+1,ls);
     
     h[nd]=(l[h[2*nd]]>l[h[2*nd+1]] ? h[2*nd] : h[2*nd+1]);
}

void interogare(int nd,int li,int ls)
{
     if(a<=li && ls<=b)
     {
       if(v[poz]<v[h[nd]] && max<l[h[nd]])
          max=l[h[nd]];
     }
     
     if(li==ls) return;
     
     int mij=(li+ls)/2;
     if(a<=mij)
       interogare(2*nd,li,mij);
     if(mij<b)
       interogare(2*nd+1,mij+1,ls);
}

int main()
{
    int maxx=1;
    int i;
    fin>>n;
    for(i=1;i<=n;i++)
      fin>>v[i];
    
    l[n]=1;
    poz=n;
    creare_arb(1,1,n);
    
    for(i=n-1;i>0;i--)
    {
      poz=i;
      
      max=0;
      a=i+1;
      b=n;
      interogare(1,1,n);
      
      l[i]=1+max;
      creare_arb(1,1,n);
      
      if(maxx<l[i])
       maxx=l[i];
    }
    
    fout<<maxx<<'\n';
    for(i=1;i<=n;i++)
      if(l[i]==maxx)
        fout<<v[i]<<' ',maxx--;
    
    fout<<'\n';
    fout.close();
    return 0;
}