Cod sursa(job #2277052)

Utilizator anghelus_vladAnghelus Ionut Vlad anghelus_vlad Data 5 noiembrie 2018 19:13:17
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb

#include <iostream>

#include<fstream>

using namespace std;

ifstream fin("scmax.in");

ofstream fout("scmax.out");

int a[100001];

int poz[100001];

int a2[100001];

int best[100001];

int n,lgmax;

void contrbest();

void afisare();

int cautbinar(int el);

int main()

{

    fin>>n;

    for(int i =1; i<=n; i++)

    {

        fin>>a[i];

    }

    contrbest();

    afisare();

    return 0;

}

void contrbest()

{

    best[1]=a[1];

    lgmax=1;

    poz[1]=1;

    for(int i =2; i<=n; i++)

    {

        if(a[i]>best[lgmax])

        {

            best[++lgmax]=a[i];

            poz[i]=lgmax;

        }

        else

        {

            int pozitie=cautbinar(a[i]);

            best[pozitie]=a[i];

            poz[i]=pozitie;

        }

    }

}

int cautbinar(int el)

{

    //caut binar in best cel mai mic element >= el

    //si returnez pozitia lui

    int st=0, dr=lgmax+1;

    int mijloc;

    while(dr-st>1)

    {

        mijloc=(st+dr)/2;

        if(best[mijloc]>=el)

        {

            dr=mijloc;

        }

        else

        {

            st=mijloc;

        }

    }

    return dr;

}

void afisare()

{

    fout<<lgmax<<'\n';

    int cine =lgmax;

    for(int i=n; i>=1&&cine; i--)

    {

        if(poz[i]==cine)

        {

            a2[cine]=a[i];

            cine--;

        }

    }

    for(int i =1; i<=lgmax; i++)

    {

        fout<<a2[i]<<" ";

    }

}