Cod sursa(job #3366507)

Utilizator rapidu36Victor Manz rapidu36 Data 2 octombrie 2026 10:15:15
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>

#define N 100000

const int INF = 2e9 + 1;

int v[N], lung[N], val_min[N+1];

int max(int x, int y) {
    return (x > y ? x : y);
}

void refac_subsirul(FILE *fout, int poz, int lungime, int val) {
    if (lungime == 0) {
        return;
    }
    if (v[poz] < val && lung[poz] == lungime) {
        refac_subsirul(fout, poz - 1, lungime - 1, v[poz]);
        fprintf(fout, "%d ", v[poz]);
    } else {
        refac_subsirul(fout, poz - 1, lungime, val);
    }
}

int caut_bin(int x[], int st, int dr, int val) {
    // cautam binar cel mai mare j_0 cu x[j_0] < val
    int j_0 = 0;
    while (st <= dr) {
        int m = (st + dr) / 2;
        if (x[m] < val) {
            j_0 = m;
            st = m + 1;
        } else {
            dr = m - 1;
        }
    }
    return j_0;
}

int main(void) {
    FILE *fin = fopen("scmax.in", "r");
    int n;
    fscanf(fin, "%d", &n);
    int p_lung_max = 0, lung_max = 0;
    for (int i = 0; i < n; i++) {
        fscanf(fin, "%d", &v[i]);
        int max_lung_i = caut_bin(val_min, 1, lung_max, v[i]);
        lung[i] = 1 + max_lung_i;
        val_min[1 + max_lung_i] = v[i];
        if (lung[i] > lung_max) {
            p_lung_max = i;
            lung_max = lung[i];
        }
    }
    fclose(fin);
    FILE *fout = fopen("scmax.out", "w");
    fprintf(fout, "%d\n", lung[p_lung_max]);
    refac_subsirul(fout, p_lung_max, lung[p_lung_max], INF);
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}