Cod sursa(job #2676447)

Utilizator rapidu36Victor Manz rapidu36 Data 24 noiembrie 2020 11:59:03
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100000

int v[N], l[N], n, vmin[N], lmax;
FILE *in, *out;

void subsir(int p)
{
    int i = p - 1;
    while (i >= 0 && (v[i] >= v[p] || l[i] != l[p] - 1))///n-am gasit predecesorul lui v[p]
    {
        i--;
    }
    if (i >= 0)
    {
        subsir(i);
    }
    fprintf(out, "%d ", v[p]);
}

int caut_binar(int val)
{
    ///returneaza j maxim cu proprietatea ca exista vmin[j] < val
    if (vmin[lmax] < val)
    {
        return lmax;
    }
    int st = 1, dr = lmax;
    while (st < dr)
    {
        int m = (st + dr) / 2;
        if (vmin[m] >= val)
        {
            dr = m;
        }
        else
        {
            st = m + 1;
        }
    }
    return st - 1;///pe poz st se afla j minim cu vmin[j] >= val
}

int main()
{
    in = fopen("scmax.in", "r");
    out = fopen("scmax.out", "w");
    fscanf(in, "%d", &n);
    int i, imax = 0;
    for (i = 0; i < n; i++)
    {
        fscanf(in, "%d", &v[i]);
    }
    fclose(in);
    l[0] = 1;
    vmin[++lmax] = v[0];
    for (i = 1; i < n; i++)
    {
        int j = caut_binar(v[i]);
        vmin[j+1] = v[i];
        if (j == lmax)
        {
            ++lmax;
        }
        l[i] = j + 1;
        if (l[i] > l[imax])
        {
            imax = i;
        }
    }
    fprintf(out, "%d\n", l[imax]);///lmax = l[imax]
    subsir(imax);
    fclose(out);
    return 0;
}