Cod sursa(job #1836417)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 28 decembrie 2016 12:57:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int MAX_N = 1 + 100000;

/*-------- Datele de intrare --------*/
int N;
int a[MAX_N];
/*-------- Datele algoritmului --------*/
int indice[MAX_N];
int indice_anterior[MAX_N];
int solutie[MAX_N];

int lungime;

void citire()
{
    int i;
    fin>>N;
    for(i=1; i<=N; i++)
        fin>>a[i];
}

int bs(int i)
{
    int st=1, dr=lungime, sol=0;
    while(st<=dr)
    {
        int mij=(st+dr)>>1;
        if(a[i]>a[indice[mij]])
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    return sol+1;
}

void construieste_dinamica()
{
    indice[1]=1;
    lungime=1;
    for(int i=2; i<=N; i++)
    {
        if(a[i]>a[indice[lungime]])
        {
            ++lungime;
            indice[lungime]=i;
            indice_anterior[i] = indice[lungime - 1];
        }
        else
        {
            int pozitie= bs(i);
            indice[pozitie]=i;
            indice_anterior[i]=indice[pozitie-1];
        }
    }
}

void construieste_solutie()
{
    int pozitie=lungime;
    int i= indice[lungime];

    while(i>0)
    {
        solutie[pozitie]=a[i];
        i=indice_anterior[i];
        pozitie--;
    }

}

void afisare()
{
    fout<<lungime<<'\n';
    for(int i=1; i <=lungime; i++)
        fout<<solutie[i]<<" ";
}

int main()
{
    citire();
    construieste_dinamica();
    construieste_solutie();
    afisare();
    return 0;
}