Cod sursa(job #260909)

Utilizator TottiRus TIberiu Gabriel Totti Data 17 februarie 2009 18:15:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>  
#define MAX 100001  
   
 using namespace std;  
   
 ifstream fin ("scmax.in");  
 ofstream fout ("scmax.out");  
   
 int sir[MAX],poz[MAX],tata[MAX],sir_f[MAX];  
 int lg,n;  
   
 void citire()  
 {  
      fin>>n;  
      for (int i=1;i<=n;i++)  
           fin>>sir[i];  
 }  
   
 void rezolvare()  
 {  
      int mij,st,dr;  
      sir_f[1]=sir[1];  
      poz[1]=1;  
      lg=1;  
   
      for (int i=2;i<=n;i++)  
      {  
           if (sir[i]>sir_f[lg])  
           {  
                lg++;  
                sir_f[lg]=sir[i];  
                tata[i]=poz[lg-1];  
                poz[lg]=i;  
                continue;  
           }  
   
           if (sir[i]<=sir_f[1])  
           {  
                sir_f[1]=sir[i];  
                poz[1]=i;  
                tata[i]=0;  
                continue;  
           }  
           st=1;  
           dr=lg;  
           while (dr-st>1)  
           {  
                mij=(st+dr)>>1;  
                if (sir_f[mij]<sir[i])  
                     st=mij;  
                else  
                     dr=mij;  
           }  
   
           if (sir[i]<sir_f[dr])  
           {  
                poz[dr]=i;  
               tata[i]=poz[st];  
                sir_f[dr]=sir[i];  
           }  
      }  
 }  
 void afishare(int x)  
 {  
      if (!x)  
           return;  
      afishare(tata[x]);  
      fout<<sir[x]<<" ";  
 }  
   
 int main ()  
 {  
      citire();  
      rezolvare();  
      fout<<lg<<"\n";  
      afishare(poz[lg]);  
      return 0;  
 }