Cod sursa(job #1292451)

Utilizator DavidDragulinDragulin David DavidDragulin Data 14 decembrie 2014 13:03:12
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100004],v[100004],d[100004],i,maxim,n,st,dr,poz,mij;
int dreapta;

void rec(int i, int maxim)
{
    if (maxim == 0) return;

    while( !(a[i]<dreapta && d[i] == maxim ))
        i--;
    dreapta = a[i];
    rec(i-1,maxim-1);
    fout<<a[i]<<" ";

}
int main()
{
    fin>>n;
    maxim=1;
    for(i=1;i<=n;i++)fin>>a[i];
    v[1]=a[1];
    d[1]=1;
    for(i=2;i<=n;i++)
    {
     st=1;
     dr=d[i-1];
     while(st<=dr)
     {
         mij=(st+dr)/2;
         if(v[mij]<a[i])
         {
             poz=mij;
             st=mij+1;
         }
         else dr=mij-1;
     }
      if(poz)
      {
          poz++;
          d[i]=poz;
          v[poz]=a[i];
          if(maxim<d[i])maxim=d[i];
          poz=0;
      }
      else
      {
          d[i]=1;
          v[1]=a[i];
      }

    }


    fout<<maxim<<'\n';
    dreapta = 2000000001;
    rec(n,maxim);
    return 0;
}