Cod sursa(job #2559125)

Utilizator pandurelPanduru Andrei pandurel Data 27 februarie 2020 00:27:03
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

/// subsir crescator de lungime maxima (cu cautare binara)

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n, a[100001], q[100001], p[100001], r[100001], lmax;

void citire()
{
    f>>n;
    for(int i=1; i<=n; ++i)
        f>>a[i];
}

int cautare_binara(int x, int a[], int n)
{
    int lo=0, hi=n+1, mij;

    while(hi-lo>1)
    {
        mij=(hi+lo)/2;
        if(x>a[mij])
            lo=mij;
        else hi=mij;
    }
    if(hi<n+1 && a[hi]==x)
        return hi;
}

void formarePQ()
{
    int poz;
    q[1]=a[1];
    p[1]=1;
    lmax=1;

    for(int i=2; i<=n; ++i)
    {
        if(a[i]>q[lmax])
        {
            q[++lmax]=a[i];
            p[i]=lmax;
        }
        else
        {
            poz=cautare_binara(a[i], q, lmax);
            q[poz]=a[i];
            p[i]=poz;
        }
    }
    g<< lmax << '\n';
}

void solutie()
{
    int s=lmax;

    for(int i=n; i>=1; --i)
    {
        if(p[i]==s)
        {
            r[s]=a[i];
            --s;
        }
        if(s==0)
            break;
    }

    for(int i=1; i<=lmax; ++i)
        g<< r[i] << ' ';
}

int main()
{
    citire();
    formarePQ();
    solutie();

    return 0;
}