Cod sursa(job #2805828)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 02:18:24
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#define N 100002
#include <iostream>

using namespace std;
FILE* f, * g;

int x[N], pred[N], v[N], lg;

void write(int poz)
{
    if (pred[poz])
    {
        write(pred[poz]);
    }
    fprintf(g, "%d ", x[poz]);
}
int cb(int i)
{
    if (lg == 0 || x[v[lg]] < x[i])
        v[++lg] = i, pred[i] = v[lg - 1];
    else
    {
        int st, dr, mij, poz = 1;
        st = 1, dr = lg;
        while (st <= dr)
        {
            mij = (st + dr) / 2;
            if (x[v[mij]] < x[i])
                poz = st = mij + 1;
            else
                dr = mij - 1;
        }
        v[poz] = i;
        pred[i] = v[poz - 1];
    }

}

int main()
{
    f = fopen("scmax.in", "r");
    g = fopen("scmax.out", "w");
    int n;
    fscanf(f, "%d", &n);
    for (int i = 1;i <= n;++i)
    {
        fscanf(f, "%d", &x[i]);
        cb(i);
    }
    fprintf(g, "%d\n", lg);
    write(v[lg]);
    fclose(f);
    fclose(g);
    return 0;
}