Cod sursa(job #2968709)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 21 ianuarie 2023 20:27:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>

const uint32_t MAX_N = 100000;
const uint32_t MAX_N_POW_2 = 65536;

uint32_t v[MAX_N], s[MAX_N], prev[MAX_N];
FILE* fout;

uint32_t Search(uint32_t val, uint32_t len) {
    uint32_t pos = len;
    for(uint32_t step = MAX_N_POW_2; step; step >>= 1)
        if(pos >= step && v[s[pos - step]] >= val)
            pos -= step;
    
    return pos;
}
void Output(uint32_t pos) {
    if(pos == UINT_MAX)
        return;
    
    Output(prev[pos]);
    fprintf(fout, "%u ", v[pos]);
}

int main() {
    FILE* fin = fopen("scmax.in", "r");
    fout = fopen("scmax.out", "w");

    uint32_t n;
    fscanf(fin, "%u", &n);

    for(uint32_t i = 0; i != n; ++i)
        fscanf(fin, "%u", v + i);

    uint32_t maxLength = 0;
    for(uint32_t i = 0; i != n; ++i) {
        uint32_t length = Search(v[i], maxLength);
        s[length] = i;

        prev[i] = length ? s[length - 1] : UINT_MAX;
        maxLength = (maxLength < length + 1) ? length + 1 : maxLength;
    }

    fprintf(fout, "%u\n", maxLength);

    uint32_t pos = s[maxLength - 1];
    Output(pos);

    fclose(fin);
    fclose(fout);

    return 0;
}