Cod sursa(job #3135920)

Utilizator razviOKPopan Razvan Calin razviOK Data 4 iunie 2023 18:07:01
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>

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

    unsigned int n,len=0,j=0,cnt;
    scanf("%u",&n);

    unsigned int *arr=(unsigned int *)calloc(n,sizeof(unsigned int));
    unsigned int *T=(unsigned int *)calloc(n,sizeof(unsigned int));
    int *R=(int *)calloc(n,sizeof(int));

    for(unsigned int i=0; i<n; i++){
        scanf("%u",&arr[i]);
        R[i]=-1;
    }

    T[0]=0;
    len=0;

    for(unsigned int i=1; i<n; i++){

        if(arr[i]>arr[T[len]]){
            R[i]=T[len];
            len++;
            T[len]=i;
        }
        else{
            j=0;
            while(arr[i]>arr[T[j]])
                j++;

            if(j==0)
                R[i]=-1;
            else R[i]=T[j-1];

            T[j]=i;
        }
    }

    cnt=len+1;
    printf("%u\n",cnt);
    unsigned int *bst=(unsigned int *)calloc(cnt,sizeof(unsigned int));

    j=T[len];
    while(R[j]!=-1){
        bst[len]=arr[j];
        j=R[j];
        len--;
    }
    bst[len]=arr[j];

    for(unsigned int i=0; i<cnt; i++){
        printf("%u ",bst[i]);
    }

    free(bst);
    free(arr);
    free(T);
    free(R);

    return 0;
}