Cod sursa(job #2267083)

Utilizator mihai002016Zaharia Teodor Mihai mihai002016 Data 23 octombrie 2018 10:50:57
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 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]<<" ";
    }
}