Cod sursa(job #971036)

Utilizator BFlorin93Balint Florin-Lorand BFlorin93 Data 8 iulie 2013 13:20:17
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>


int V[100000];

int  binary1(int A,int B,int x)
{
  if (V[A]==x)
  {
  int y=V[A];
   while (V[A+1]==y)
   {
      A++;
   }
      return A;
  }
  else if (B==A) return -1;
  else
   {
      if (V[A+(B-A)/2]>x) return binary1(A,A+(B-A)/2,x);
      else return binary1(A+(B-A)/2,B,x);
   }
}


int binary2(int A,int B,int x)
{
  if ((V[A]<=x) && ((B==A) || (B==A+1)))
  {
    int y=V[A];
      while (V[A+1]==y)
   {
      A++;
   }
      return A;
  }
  else
  {
       if (V[A+(B-A)/2]>x) return binary2(A,A+(B-A)/2,x);
      else return binary2(A+(B-A)/2,B,x);
  }
}

int binary3(int A,int B,int x)
{
    if ((A==B) || (A+1==B))
    {
      if ((A==B) || (V[A]<x))
        {
        int y=V[B];
        while (V[B-1]==y) B--;
        return B;
        }
      else
        {
         int y=V[A];
        while (V[A-1]==y) A--;
        return A;
        }
    }
  else
  {
       if (V[A+(B-A)/2]>x) return binary3(A,A+(B-A)/2,x);
      else return binary3(A+(B-A)/2,B,x);
  }
}



int main()
{
  int n;

  FILE *f;
  FILE *g;

  f=fopen("cautbin.in","r");
  g=fopen("cautbin.out","w");

  fscanf(f,"%d",&n);
  V[0]=1999999999;
  V[n+1]=-1;
int i;
  for (i=1;i<=n;i++)
  {
    fscanf(f,"%d",&V[i]);
  }
 int x;
 int m;
 i==10000;
 fscanf (f,"%d",&m);
 while (m)
 {
 fscanf(f,"%d %d",&i,&x);

 if (i==0) fprintf(g,"%d\n",binary1(1,n,x));
 else if (i==1) fprintf(g,"%d\n",binary2(1,n,x));
 else if (i==2) fprintf(g,"%d\n",binary3(1,n,x));
 m--;
 }

fclose(g);
return 0;
}