Cod sursa(job #2606403)

Utilizator DBogdan23Dumitru Bogdan Mihai DBogdan23 Data 27 aprilie 2020 17:47:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
///Bogdan-Mihai Dumitru, O(n*log n)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, v[100001],poz[100001],urm[100001],lg[100001],elem=1;
void citire()
{
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
    lg[1]=urm[1]=1;
    urm[0]=0;///indexarea se face de la 1
}
void afis(int elem)
{
    if(poz[elem]>0)
        afis(poz[elem]);
    out<<v[elem]<<' ';
}
int cautUrmNr(int nr)
{
    int st=0,dr=elem,mij=(st+dr)/2;
    while(st<=dr)
    {
        if(v[urm[mij]] < nr && v[urm[mij+1]]>=nr)
            return mij;///elementul gasit poate fi pusit temporar sau permanent in solutii;
        else if(nr>v[urm[mij]])///elementul verificat este mai mic decat elementul curent, deci vom cauta in stanga pivotului
        {
            st=mij+1;
            mij=(st+dr)/2;
        }
        else///elementul verificat este mai mare decat pivotul, deci cautam sa fixam in stanga pivotului
        {
            dr=mij-1;
            mij=(st+dr)/2;
        }
    }
    return elem;///daca se returneaza asta, inseamna ca elementul gasit nu are nicio sansa sa fie in sirul final
}
int main()
{
    citire();
    int aux;
    for(int i=2;i<=n;i++)
    {
        aux=cautUrmNr(v[i]);///caut o posibila pozitie pentru elementul curent in sirul final
        poz[i]=urm[aux];
        lg[i]=aux+1;
        urm[aux+1]=i;///vectorul aux indica pentru fiecare pozitie din vector, pozitia elementului in sirul initial care a fost ales la pasul respectiv
        ///asta ne mai ajuta si la compararea urmatoarelor numere cu cele puse deja in vector pentru a ne asigura ca se potrivesc
        if(elem<aux+1)
            elem=aux+1;///indica faptul ca pe pozitia curenta am pus cel mai bun element, asa ca vom trece la urmatoare pozitie
    }
    int lgSir=0;
    for(int i=1;i<=n;i++)
        if(lgSir<lg[i])
    {
        lgSir=lg[i];
        aux=i;
    }
    out<<lgSir<<endl;
    afis(aux);
}