Cod sursa(job #3336198)

Utilizator MateiDiaconuDiaconu Matei Stefan MateiDiaconu Data 24 ianuarie 2026 13:29:41
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 100000

int v[MAXN], s[MAXN], pred[MAXN], sol[MAXN];

int search(int x, int n){
    int step, poz;

    poz = -1;
    for(step = 1 << 16; step > 0; step >>= 1){
        if(poz + step < n && v[s[poz + step]] < x){
            poz += step;
        }
    }

    return poz;
}

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

    int n, i, lmax, poz, l;

    fscanf(fin, "%d", &n);

    lmax = 0;
    for(i = 0; i < n; i++){
      fscanf(fin, "%d", &v[i]);

      l = search(v[i], lmax) + 1;
      s[l] = i;
      pred[i] = l > 0 ? s[l - 1] : -1;
      if(l + 1 > lmax){
        lmax = l + 1;
      }
    }

    fprintf(fout, "%d\n", lmax);

    poz = s[lmax - 1];
    i = lmax - 1;
    while(poz >= 0){
      sol[i] = v[poz];
      poz = pred[poz];
      i--;
    }

    for(i = 0; i < lmax; i++){
      fprintf(fout, "%d ", sol[i]);
    }

    return 0;
}