Cod sursa(job #2274827)

Utilizator bunul20Niculita Andrei Eduard bunul20 Data 2 noiembrie 2018 16:12:38
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#define NRMAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
int poz[NRMAX],a[NRMAX],best[NRMAX];
int lgmax;
int sol[NRMAX];
void citire();
void constrBest();
int cautbinar(int x);
void afisare();
int main()
{
    citire();
    constrBest();
    afisare();
    return 0;
}
void citire()
{
    int i;
    fin>>n;



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

        fin>>a[i];

}



void constrBest()

{

    int i,pozitie;



    best[1]=a[1];
    poz[1]=1;
    lgmax=1;

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

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

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

            poz[i]=lgmax;

        }

        else

        {

            pozitie=cautbinar(a[i]);

            best[pozitie]=a[i];

            poz[i]=pozitie;

        }



}

int cautbinar(int x)
//caut binar in best cel mai mic el. > x

//returnez pozitia

{

    int st=0,dr=lgmax+1,mijloc;



    while(dr-st>1)

    {
        mijloc=(st+dr)/2;

        if(best[mijloc]>=x)

            dr=mijloc;

        else

            st=mijloc;



    }



    return dr;

}



void afisare()

{

    int i,cine;



    fout<<lgmax<<'\n';

    cine=lgmax;

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

        if(poz[i]==cine)

        {
            sol[cine]=a[i];

            cine--;

        }



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

        fout<<sol[i]<<' ';



    fout<<'\n';



}