Cod sursa(job #2843466)

Utilizator BarbuceanuConstantinBarbuceanu Constantin BarbuceanuConstantin Data 2 februarie 2022 15:09:55
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
int n, v[100003], tailIndices[100003], prevIndices[100003];

int GetCeilIndex(int l, int r, int key) { 
    int m = (l + r) / 2;
    while(l <= r) {
        if (v[tailIndices[m]] < key &&  v[tailIndices[m + 1]] >= key) return m + 1;
        else if (v[tailIndices[m + 1]] < key) {l = m + 1; m = (l + r)/2;}
        else {r = m - 1; m = (l + r) / 2;}
    }
}

void print(int index) {
    if(prevIndices[index] > 0) print(prevIndices[index]);
    printf("%d ", v[index]);
}

void LongestIncreasingSubstring() {
    int i, len, pos;
    for (i = 0; i <= n; i++) {
        prevIndices[i] = -1;
    }

    len = 1;
    for (i = 1; i <= n; i++) { 
        if (v[i] < v[tailIndices[0]]) {
            //new smallest value
            tailIndices[0] = i;
        } else if (v[i] > v[tailIndices[len-1]]) {
            //v[i] wants to extend
            //largest subsequence
            prevIndices[i] = tailIndices[len-1];
            tailIndices[len] = i;
            len++;
        } else {
            //v[i] wants to be a
            //potential condidate of
            //future subsequence
            //It will replace ceil
            //value in tailIndices
            pos = GetCeilIndex(-1, len - 1, v[i]);
            prevIndices[i] = tailIndices[pos-1];
            tailIndices[pos] = i;
        }
    }

    printf("%d\n", len - 1);
    print(tailIndices[len - 1]);
}

int main() {
    freopen("scmax.in","r",stdin);	
    freopen("scmax.out","w",stdout);
    int i;

    scanf("%d", &n);
    for (i = 1; i <= n; i++){scanf("%d", &v[i]);}

    LongestIncreasingSubstring();

    return 0;
}