Pagini recente » Cod sursa (job #3218409) | Cod sursa (job #288258) | Cod sursa (job #2168219) | Cod sursa (job #192977) | Cod sursa (job #3135920)
#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;
}