Cod sursa(job #1916048)

Utilizator mariaciocanCiocan Maria mariaciocan Data 8 martie 2017 23:56:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
using namespace std;

int a[100003];
int indice[100003];
int indice_ant[100003];
int finala[100003];

int i,n,lungime=1,pozitie,x;

int caut_binar (int i)
{
    int ls,ld,mij,sol=0;
    ls=1; ld=lungime;
    while (ls<=ld)
    {
        mij=(ls+ld)/2;
        if (a[i]>a[indice[mij]]) {sol=mij; ls=mij+1;}
        else ld=mij-1;
    }
    return sol+1;

}


int main ()
{
    ifstream f ("scmax.in");
    ofstream g ("scmax.out");
    f>>n;
    indice[1]=1;
    for (i=1; i<=n; i++) f>>a[i];
    for (i=2; i<=n; i++){
        if (a[i]>a[indice[lungime]]) //daca a[i] este mai mare decat ultimul element al subsirului curent
            //atunci il adaugam la subsir
        {
            lungime++;
            indice[lungime]=i; //punem indicele noului capat de subsir
            indice_ant[i]=indice[lungime-1]; //indice anterior al noului elem este indicele fostului capat de subsir
        }
        else
        {
                //caut pe ce pozitie ar fi elem curent daca s-ar afla in subsir si nu ar conta ordinea
                //adica 1 daca este cel mai mic din subsir, sau pozitia celui mai mic nr mai mai mare ca el
                pozitie=caut_binar(i);
                indice[pozitie]=i;
                indice_ant[i]=indice[pozitie-1];
        }

    }
    g<<lungime<<'\n';
    int copie; copie=lungime;
    finala[lungime]=a[indice[lungime]]; //ultimul element al subsirului
    i=indice_ant[indice[lungime]];
    while (i!=0){
        finala[--lungime]=a[i];
        i=indice_ant[i];
    }
    for (i=1; i<=copie; i++)
        g<<finala[i]<<" ";
    return 0;
}