Cod sursa(job #659050)

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

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

void cit(int &nr){
    nr=0;
    while(buff[poz]<'0' || buff[poz]>'9')//cat timp nu e cifra, treci mai departe
        if (++poz==BUF){
            fread (buff,1,BUF,fin);
            poz=0;
        }
    while('0'<=buff[poz] && buff[poz]<='9'){//cat timp e cifra
        nr=nr*10+(buff[poz]-'0');
        if (++poz==BUF){
            fread (buff,1,BUF,fin);
            poz=0;
        }
     }
}



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
    }
    return -2;
}


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 are 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;
}