Cod sursa(job #2696359)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 15 ianuarie 2021 19:17:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <iostream>

using namespace std;

#define MAX_LENGTH 100000
#define MAX_LENGTH_BITS 16


int Array[MAX_LENGTH], MinEnding[MAX_LENGTH], PreviousIndex[MAX_LENGTH];


int BinarySearch(int target, int low, int high){
    int i=low-1, step=1<<MAX_LENGTH_BITS;

    while (step){
        if (step+i<=high && Array[MinEnding[i+step]]<target){
            i+=step;
        }
        step>>=1;
    }

    return i;
}


FILE *fout;

void PrintPath(int index){
    if (index==-1) return;

    PrintPath(PreviousIndex[index]);
    fprintf(fout, "%d ", Array[index]);
}


int main()
{
    FILE *fin=fopen("scmax.in", "r");
    int length;
    fscanf(fin, "%d", &length);

    int i;
    for (i=0; i<length; i++){
        fscanf(fin, "%d", &Array[i]);
    }
    fclose(fin);

    int subArrayLength, maxLength=0;
    for (i=0; i<length; i++){
        //printf("i=%d\n", i);

        subArrayLength=BinarySearch(Array[i], 0, maxLength-1)+1;
        MinEnding[subArrayLength]=i;

        if (subArrayLength>0) PreviousIndex[i]=MinEnding[subArrayLength-1];
        else PreviousIndex[i]=-1;
        maxLength=max(maxLength, subArrayLength+1);
    }

    fout=fopen("scmax.out", "w");
    fprintf(fout, "%d\n", maxLength);
    PrintPath(MinEnding[maxLength-1]);
    fclose(fout);

    return 0;
}