Cod sursa(job #1323228)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 20 ianuarie 2015 20:21:38
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define nmax 100005
#define inf 0x3f3f3f3f
#define algorithm

using namespace std;

int n,a[nmax],v[nmax],t[nmax],l[nmax],st[nmax],vf,nrv;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

void citire()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
        //v[i]=inf;
    }
}

int caut_bin(int x)
{
    int li=1,lf=nrv,m;
    while(li<=lf)
    {
        m=(li+lf)/2;
        if(a[v[m]]==x)
            return m;
        if(a[v[m]]>x)
        {
            lf=m-1;
            continue;
        }
        li=m+1;
    }
    return li;
}

void rezolv()
{
    int poz;
    t[1]=0;
    l[1]=0;
    v[1]=1;
    nrv=1;
    for(int i=2;i<=n;i++)
    {
        poz=caut_bin(a[i]);
        v[poz]=i;
        nrv=max(nrv,poz);
        l[i]=poz;
        t[i]=v[poz-1];
    }
}

void afisare()
{
    int mx=-1,poz;
    for(int i=1;i<=n;i++)
        if(l[i]>mx)
        {
            mx=l[i];
            poz=i;
        }
    st[++vf]=a[poz];
    while(t[poz])
    {
        poz=t[poz];
        st[++vf]=a[poz];
    }
    for(int i=vf;i>=1;i--)
        fout<<st[i]<<" ";
}

int main()
{
    citire();
    rezolv();
    afisare();
    return 0;
}