Cod sursa(job #1836416)

Utilizator andrabiaAndra Bianca Sandulescu andrabia Data 28 decembrie 2016 12:57:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N = 1 + 100000;
int N;
int a[MAX_N];
int indice[MAX_N];
int indice_anterior[MAX_N];
int solutie[MAX_N];
int lungime;
void read_input()
{
    fin >> N;
    for(int i = 1; i <= N; i++)
         fin >> a[i];
}

int cauta_binar(int i)
{
    int stanga = 1, dreapta = lungime, solutie = 0;
    while(stanga <= dreapta) {
        int mijloc = (stanga + dreapta) / 2;
        if(a[i] > a[indice[mijloc]])
            {
            solutie = mijloc;
            stanga = mijloc + 1;
            }
        else
            dreapta = 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 = cauta_binar(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 afiseaza_solutia()
{
    fout << lungime << '\n';
    for(int i = 1; i <= lungime; i++)
        fout << solutie[i] << " ";
}

int main()
{
    read_input();
    construieste_dinamica();
    obtine_solutia();
    afiseaza_solutia();
    return 0;
}