Cod sursa(job #2275141)

Utilizator OvidiuDestulDeOkNicoleanu Ovidiu OvidiuDestulDeOk Data 2 noiembrie 2018 21:12:19
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

#define NMAX 100002

using namespace std;

ifstream fin("scmax.in");

ofstream fout("scmax.out");

int n, lgmax;

int a[NMAX];

int poz[NMAX];

int best[NMAX];

int s[NMAX];



void citire();

void constrbest();

void afisare();

int cautbin(int x);

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];

    lgmax=1;

    poz[1]=1;

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

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

        {

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

            poz[i]=lgmax;

        }

        else

        {

            pozitie=cautbin(a[i]);

            best[pozitie]=a[i];

            poz[i]=pozitie;

        }



}



int cautbin(int x)//caut binar in best cel mai mic elemnt >=x si returnez pozitia lui

{

    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; i--)

        if (poz[i]==cine)

        {

            s[cine]=a[i];

            cine--;

        }

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

            fout <<s[i]<<" ";

}