Cod sursa(job #2674807)

Utilizator rapidu36Victor Manz rapidu36 Data 20 noiembrie 2020 12:42:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100000

int v[N], l[N], vmin[1+N], n, m;
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 cautbin(int x)
{
    ///caut cel mai mic j cu vmin[j] >= x
    if (x > vmin[m])
    {
        return 1 + m;
    }
    int st = 1, dr = m;
    while (st < dr)
    {
        int mijloc = (st + dr) / 2;
        if (vmin[mijloc] >= x)
        {
            dr = mijloc;
        }
        else
        {
            st = mijloc + 1;
        }
    }
    return st;
}

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