Cod sursa(job #2576377)

Utilizator Calin_la_al_patrulea_contNavadaru Calin Calin_la_al_patrulea_cont Data 6 martie 2020 18:52:15
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#define Nrmax 100000

using namespace std;

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

int a[Nrmax];
int dp[Nrmax];
int p[Nrmax];
int nr_elemente;
int nr_dp = 1;
int nr_p = 1;
int nr_elemente_solutie =1 ;

int cautare_binara(int val, int nr_elemente_dp)
{
    int i, step;
    for (step = 1; step < nr_elemente_dp; step <<= 1);
    for (i = 1; step; step >>= 1)
        if (i + step < nr_elemente_dp && dp[i + step] >= val)
            i += step;
    return i;
}

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

void parg()
{
    dp[nr_dp++] = a[1];
    p[nr_p++] = 1;
    for(int i = 2; i <= nr_elemente ; i++)
    {
        if(a[i] <= dp[nr_dp-1])
        {
            int poz = cautare_binara(a[i],nr_dp);
            dp[poz] = a[i];
            p[nr_p] = p[poz];
            nr_p++;
        }
        else
        {
            dp[nr_dp++] = a[i];
            nr_elemente_solutie++;
        }
    }
}

void afisare(int a[], int nr_elemente)
{
    for(int i = 1; i <= nr_elemente ; i++)
        cout << a[i] << ' ';
    cout << '\n';
}

int main()
{
    citire();
    parg();
    g << nr_elemente_solutie << '\n';
    for(int i = 1; i <= nr_elemente_solutie ; i++)
        g << dp[i] << ' ';
    return 0;
}