Pagini recente » Cod sursa (job #2142942) | Cod sursa (job #2004109) | Cod sursa (job #1936628) | Cod sursa (job #1983745) | Cod sursa (job #2152746)
#include <stdio.h>
#include <stdlib.h>
int cautBinara(int* T, int *v, int x, int inc, int sf)
{
if(inc+1 == sf){
if(v[T[sf]] <= x) return sf;
else if(v[T[inc]]<= x) return inc;
else return inc-1;
}
int n =(sf + inc)/2;
if(x < v[T[n]]) return cautBinara(T,v,x,inc,n);
else if(x >= v[T[n]]) return cautBinara(T,v,x,n,sf);
}
int main()
{
FILE *fi, *fo;
fi = fopen("scmax.in", "r");
int n, i, j , l = 0, sf, inc;
fscanf(fi, "%d", &n);
int *v =(int*)malloc(n*sizeof(int));
int *T =(int*)malloc(n*sizeof(int));
int *R =(int*)malloc(n*sizeof(int));
if(!v || !T || !R) {printf("Error!"); return -1;}
if(n <= 0) return 0;
fscanf(fi, "%d", &v[0]);
T[0] = 0;
for(i = 1; i < n; i++)
{
fscanf(fi, "%d", &v[i]);
if(v[i] > v[T[l]]) {
R[i] = T[l];
l++;
T[l] = i;
}
if(v[i] < v[T[0]]) {
T[0] = i;
}
else {
int y = cautBinara(T,v, v[i], 0, l);
T[y] = i;
R[i] = T[y-1];
}
}
int k = T[l], len = l;
while(l != -1)
{
T[l] = v[k];
k = R[k];
l--;
}
fo = fopen("scmax.out", "w");
fprintf(fo, "%d", T[0]);
for(i = 1; i <= len; i++)
fprintf(fo, " %d", T[i]);
fprintf(fo, "\n");
free(v);
free(T);
free(R);
return 0;
}