Cod sursa(job #259962)

Utilizator catalina5catalina serban catalina5 Data 16 februarie 2009 10:45:05
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 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;
}