Cod sursa(job #1785274)

Utilizator andysoloAndrei Solo andysolo Data 21 octombrie 2016 00:03:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;

int v[100001],n;
int p[100001];
int q[100001];
int l;

ifstream a("scmax.in");
ofstream b("scmax.out");

int cautbin(int f,int l,int x)
{
    int m=f+(l-f)/2;

    if(f<l)
    {
        if(x<=q[m])
            return cautbin(f,m,x);
        else return cautbin(m+1,l,x);

    }
    else if(f==l && x<=q[f])return f;
    else return f+1;

}

void afisare(int m,int i,int d)
{
    if(m==0 || i==0)
        return;
    else if((d==0||v[i]<v[d])&&p[i]==m)
    {
        afisare(m-1,i-1,i);
        b<<v[i]<<" ";
    }
    else afisare(m,i-1,d);

}


int main()
{
    a>>n;
    for(int i=1;i<=n;i++)
    a>>v[i];

    p[1]=1;
    q[1]=v[1];
    l=1;

    for(int i=2;i<=n;i++)
    {
        int poz=0;
        poz=cautbin(1,l,v[i]);
        q[poz]=v[i];
        p[i]=poz;
        if(poz>l)l++;
    }

    int m=0,d=0;
    for(int i=1;i<=n;i++)
        if(m<p[i])
        {
            m=p[i];
            d=i;
        }
    b<<m<<'\n';
 //   b<<v[d];
 //   for(int i=d-1;i>=1;i--)
 //       if(p[i]==m-1 && v[i]<)

    afisare(m,n,0);


    return 0;
}