Cod sursa(job #1008889)

Utilizator keisecGinghina Cristian keisec Data 12 octombrie 2013 10:15:35
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>
#include<stdlib.h>

int *v;
int N,M;

int rez_max(int x)
{
  while(v[x+1]==v[x])x++;
  return x+1;
}
int rez_min(int x)
{
  while(v[x-1]==v[x])x--;
  return x+1;
}

int f1(int i,int fdiv,int val)
{
  if(i>=N)return f1(i-fdiv,fdiv>>1,val);
  if(v[i]==val)return rez_max(i);
  if(fdiv==0)return -1;
  if(v[i]>val)return f1(i-fdiv,fdiv>>1,val);
  return f1(i+fdiv,fdiv>>1,val);
}

int f2(int i,int fdiv,int val)
{
  if(i>=N)return f2(i-fdiv,fdiv>>1,val);
  if(v[i]==val)return rez_max(i);
  if(fdiv==0){
    while(v[i]<val)i++;
    return rez_max(i);
  }
  if(v[i]>val)return f2(i-fdiv,fdiv>>1,val);
  return f2(i+fdiv,fdiv>>1,val);
}

int f3(int i,int fdiv,int val)
{
  if(i>=N)return f3(i-fdiv,fdiv>>1,val);
  if(v[i]==val)return rez_min(i);
  if(fdiv==0){
    while(v[i]>val)i--;
    return rez_min(i);
  }
  if(v[i]<val)return f3(i+fdiv,fdiv>>1,val);
  return f3(i-fdiv,fdiv>>1,val);
}

int init(int x,int y)
{
  int aux=1;
  while(aux<=N)aux=aux<<1;
  aux=aux>>1;
  switch(y){
  case 0:
    return f1(aux-1,aux>>1,x);
  case 1:
    return f2(aux-1,aux>>1,x);
  case 2:
    return f3(aux-1,aux>>1,x);
  }
}

int main()
{
  FILE*fin,*fout;
  fin=fopen("cautbin.in","r");
  fout=fopen("cautbin.out","w");
  
  fscanf(fin,"%d",&N);
  v=(int*)malloc(N*sizeof(int));
  int i;
  for(i=0;i<N;i++){
    fscanf(fin,"%d",&v[i]);
  }
  
  fscanf(fin,"%d",&M);
  for(i=0;i<M;i++){
    int x,y;
    fscanf(fin,"%d %d",&y,&x);
    fprintf(fout,"%d\n",init(x,y));
  }
  fclose(fin);
  fclose(fout);
}