Cod sursa(job #183057)

Utilizator floringh06Florin Ghesu floringh06 Data 21 aprilie 2008 17:53:14
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>     
#include <cstring>
#include <algorithm>

using namespace std;

#define FIN "scmax.in"
#define FOUT "scmax.out"
#define MAX_N 100005
int V[MAX_N];
int B[MAX_N];
int p[MAX_N];
int k, nr, N;
int L[MAX_N];

int BEST;
int i, j, pz;  
      
    int search(int x)  
    {  
         int li = 0, lf = nr, m;  
         while (li <= lf)  
         {
               m = (li + lf) >> 1;  
               
               if (V[ L[m] ] < x &&  V[ L[m + 1] ] >= x) return m;  
               if (V[ L[m + 1] ] < x) li = m + 1; 
                             else lf = m - 1; 
         }  
       
         return nr;  
    }  

    inline void print (int c)  
    {  
         if (p[c]) print(p[c]);
         printf("%d ",V[c]);  
    }  
    
    void solve ()
    {
       int i;  
       B[1] = L[1] = 1; 
  
       for (i = 2; i <= N; i++)  
       {  
          pz = search(V[i]), p[i] = L[pz];  
          B[i] = pz + 1, L[pz + 1] = i;  
          
          if (nr < pz + 1)   nr = pz + 1;  
       }  
       
       for (i = 1; i <= N; i++) if (BEST < B[i]) BEST = B[i], pz = i;  
    }
  
    int main()  
    {  
       freopen(FIN, "r", stdin);  
       freopen(FOUT, "w", stdout);  
  
       scanf("%d", &N);  
       for (i = 1; i <= N; i++) scanf("%d", V + i); 
       solve (); 

       printf("%d\n", BEST), print(pz);  
       
       return 0;     
    }