Cod sursa(job #918047)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 18 martie 2013 16:26:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>

using namespace std;

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    
    //cout<<"alegeti elevul curent 1"<<endl;
    int v[100005],q[100005],p[100005],sol[100005];
    int n,i;
    
    fin>>n;
    
    for(i=0;i<n;i++)
    {
         fin>>v[i];           
    }
    
  //  cout<<"continuam"<<endl;
    
    int lung=1,cap,coada,mijl,raspuns;
    
    q[0]=v[0];
    p[0]=0;
    
    for(i=1;i<n;i++)
    {
        cap=0;
        coada=lung-1;
        mijl=(lung-1)/2;
        raspuns=lung;
        
        while(cap<=coada)
        {
            if(q[mijl]>=v[i])
            {
               if(mijl<raspuns)
                  raspuns=mijl;
                  
               coada=mijl-1;               
            }
            else
            {
               cap=mijl+1; 
            }
            
            mijl=(cap+coada)/2;                 
        }
        
        q[raspuns]=v[i];
        p[i]=raspuns;
        
        if(raspuns==lung)
        {
           lung++;    
        }
                    
    }
    
    fout<<lung<<'\n';
    
    int copie=lung;
    
   // int poz=lung-1;
    
  //  cout<<"n este "<<n<<endl;
    //cout<<"p este "<<endl;

    lung--;
    
    //cout<<"lung este "<<lung<<endl;
    for(i=n-1;lung>=-1 && i>=0;i--)
    {
    //   cout<<"se verifica daca "<<p[i]<<" = "<<lung<<endl;                
       if(p[i]==lung)
       {
    //      cout<<"da";
          sol[lung--]=v[i];
       }
    }
 //   cout<<"pana aici"<<endl;
   // cout<<endl;
    for(i=0;i<copie;i++)
    {
       fout<<sol[i]<<' ';                    
    }
    
    fin.close();
    fout.close();
    
    //system("PAUSE");
    return 0;
}