Cod sursa(job #2272399)

Utilizator RadulescuRichardAndreiRadulescu Richard- Andrei RadulescuRichardAndrei Data 30 octombrie 2018 09:54:17
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 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';

}