Cod sursa(job #1836433)

Utilizator mitza_florescuMihai Florescu mitza_florescu Data 28 decembrie 2016 13:04:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

const int MAX_N = 100001;
int N, a[MAX_N], indice[MAX_N], indice_anterior[MAX_N], solutie[MAX_N], lungime;

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

int bs(int i)
{
    int st=1, dr=lungime, solutie=0;
    while(st<=dr)
    {
        int mijloc=(st+dr)/2;
        if(a[i]>a[indice[mijloc]])
        {
            solutie=mijloc;
            st=mijloc+1;
        }
        else
            dr=mijloc-1;
    }
    return solutie+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 obtine_solutia()
{
    int pozitie = lungime, i = indice[lungime];

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

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

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