Cod sursa(job #198924)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 16 iulie 2008 09:28:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
# include <stdio.h>

using namespace std;

# define FIN "scmax.in"
# define FOUT "scmax.out"
# define MAXN 100001

int N,i,L,poz,p;
int v[MAXN];
int pred[MAXN];
int M[MAXN];
int Best[MAXN];

    int search(int x,int st,int dr)
    {
        int mij,poz=0;
        
        while (st <= dr)
          {
              mij = (st+dr) >> 1;
              if (v[M[mij]] < x)
                {
                   poz = mij;
                   st = mij + 1;
                }
              else dr = mij - 1;
          }
        return poz;
    }
    
    void write(int p)
    {
         if (pred[p] != 0) write(pred[p]);
         printf("%d ",v[p]);
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d",&N);
        for (i = 1; i <= N; ++i)
          scanf("%d",&v[i]);
          
        L = 1;
        M[1] = 1;
        Best[1] = 1;
        p = 1;
        for (i = 2; i <= N; ++i)
          {
               poz = search(v[i],0,L);
               Best[i] = poz + 1;
               M[poz + 1] = i;
               pred[i] = M[poz];
               if (L < poz + 1) L = poz + 1, p =i;;  
          }        
          
        printf("%d\n",L);
        write(p);
          
        return 0;
    }