Cod sursa(job #3135905)

Utilizator razviOKPopan Razvan Calin razviOK Data 4 iunie 2023 17:45:12
Problema Subsir crescator maximal Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 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++;

            R[i]=R[T[j]];
            T[j]=i;
        }
    }
   cnt=len;
   printf("%u\n",len+1);
   unsigned int *bst=(unsigned int *)calloc(len+1,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;
}