Pagini recente » Borderou de evaluare (job #1297451) | Borderou de evaluare (job #320163) | Borderou de evaluare (job #1263508) | Borderou de evaluare (job #210919) | Cod sursa (job #3135905)
#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;
}