Cod sursa(job #659022)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 9 ianuarie 2012 22:03:33
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <stdio.h>
#define nmax 100010
#define BUF 100010

char buffer[BUF+4];
int poz=BUF-1;
FILE *fin;

void cit(int &n){
   n=0;
   poz++;
   if(poz==BUF){
     poz=0;
     //citesc o noua linie
     fread (buffer,sizeof(char),BUF,fin);
   }
   while(buffer[poz]>='0' && buffer[poz]<='9'){
      n=n*10+(buffer[poz]-'0');
      poz++;
      if(poz==BUF){
       poz=0;
       //citesc o noua linie
       fread (buffer,sizeof(char),BUF,fin);
      }
   }
}


int v[nmax];
int val;

int cauta0(int li, int ls){
    //cea m mare poz pe care se afla un elem cu val x
    if(li==ls){
      if(v[li]==val)return li;
       return -2;
    }
    if(li<ls){//am cel putin doua elemente
      int mij=li+((ls-li)>>1);
      if(v[mij]==val){
         if(v[mij+1]>val)return mij;
         return cauta0(mij+1,ls);
      }
      if(v[mij]>val) return cauta0(li,mij-1);//trebuie sa caut in prima jumatate
      if(v[mij]<val) return cauta0(mij+1,ls);//trebuie sa caut in a doua jumatate
    }
}


int cauta1(int li, int ls){
   //cea mai mare poz care are un elem mai mic/egal ca val
    if(li==ls){
      if(v[li]<=val)return li;
       return -1;
    }
    if(li<ls){//am cel putin doua elemente
      int mij=li+((ls-li)>>1);
      if(v[mij]<=val){
         if(v[mij+1]>val)return mij;
         return cauta1(mij+1,ls);
      }
      if(v[mij]>val) return cauta1(li,mij-1);//trebuie sa caut in prima jumatate
    }
}

int cauta2(int li, int ls){
   //cea mai mica poz care un elem mai mare/egal ca val
    if(li==ls){
      if(v[li]>=val)return li;
       return -1;
    }
    if(li<ls){//am cel putin doua elemente
      int mij=li+((ls-li)>>1)+1;//daca am exact doua, mij va fi al doilea
      if(v[mij]>=val){
         if(v[mij-1]<val)return mij;
         return cauta2(li,mij-1);
      }
      if(v[mij]<val) return cauta2(mij+1,ls);//trebuie sa caut in prima jumatate
    }

}

int main(){
  int n,m;
  fin=fopen("cautbin.in","r");
  FILE *fout=fopen("cautbin.out","w");
  cit(n);
  int i;
  for(i=0;i<n;i++)
    cit(v[i]);
  cit(m);
  int cod,x,aux;  
  for(i=0;i<m;i++){
     cit(cod);
     cit(x);
     switch(cod){
       case 0: val=x;aux=cauta0(0,n-1)+1;
          break;

       case 1: val=x;aux=cauta1(0,n-1)+1;
          break;
       
       case 2: val=x;aux=cauta2(0,n-1)+1;
          break;
     }
     fprintf(fout,"%d\n",aux);
  }
  fclose(fin);   
  fclose(fout);
return 0;
}