Cod sursa(job #655930)

Utilizator galbenugalbenu dorin galbenu Data 3 ianuarie 2012 17:16:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#define lmax 100002
using namespace std;
ifstream f("scmax.in",fstream::in);
ofstream g("scmax.out",fstream::out);
int n,maxim,k,poz,nr,v[lmax],p[lmax],best[lmax],l[lmax];
void show(int x)
{
    if(p[x]>0)
    show(p[x]);
   g<<v[x]<<" ";
}
int cauta(int x)
{
    int st,dr,m;
    st=0;
    dr=nr;
    m=(st+dr)/2;
    while(st<=dr)
    {
        if(v[l[m]]<x && v[l[m+1]]>=x)
        return m;
        else
         if(v[l[m+1]]<x)
          {
              st=m+1;
              m=(st+dr)/2;
          }
          else
          {
              dr=m-1;
              m=(st+dr)/2;
          }
    }
return nr;
}
void read()
{
    int i;
    f>>n;
    for(i=1;i<=n;i++)
    f>>v[i];
}
void init()
{
    nr=1;
    best[1]=l[1]=1;
    l[0]=0;
}
void solve()
{
    int i;
    for(i=2;i<=n;i++)
    {
        poz=cauta(v[i]);
        p[i]=l[poz];
        best[i]=poz+1;
        l[poz+1]=i;
        if(nr<poz+1)
        nr=poz+1;
    }
}
int main()
{
    read();
    init();
    solve();
    maxim=0;poz=1;
    for(int i=1;i<=n;i++)
     if(best[i]>maxim)
     maxim=best[i],poz=i;
    g<<maxim<<"\n";
    show(poz);
    f.close();
    g.close();
    return 0;
}