Cod sursa(job #2152751)

Utilizator Vlad98Popa Vlad-Gabriel Vlad98 Data 5 martie 2018 19:33:12
Problema Subsir crescator maximal Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.35 kb
#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;
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\n", len+1);
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;
}