Cod sursa(job #270638)

Utilizator philipPhilip philip Data 4 martie 2009 12:30:10
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
 include <stdio.h>  
 define MAXN 100005  
   
 int n,M;  
 int v[MAXN];  
   
 FILE *in  = fopen("cautbin.in","r");  
 FILE *out = fopen("cautbin.out","w");  
   
 void citire()  
 {  
       
     int i;  
       
     fscanf(in,"%d",&n);  
       
     for (i=1; i<=n; ++i)  
         fscanf(in,"%d",&v[i]);  
       
     fscanf(in,"%d",&M);  
       
 }  
   
 int serci0(int x)  
 {  
     int s,e,m;  
       
     s=1; e=n; m=(s+e)/2;  
       
     while (s!=e)  
     {  
         if (x<=v[m])  
             e=(s+e)/2;  
         else  
             s=(s+e)/2+1;  
         m=(s+e)/2;  
     }  
       
     if (x<v[s])  
     {  
         if (x==v[s-1] && s!=1)  
             return s-1;       
         return -1;  
     }  
     if (x==v[s])  
         return s;  
     return -1;  
 }  
   
 int serci1(int x)  
 {  
     int s,e,m;  
       
     s=1; e=n; m=(s+e)/2;  
       
     while (s!=e)  
     {  
         if (x<v[m])  
             e=(s+e)/2;  
         else  
             s=(s+e)/2+1;  
         m=(s+e)/2;  
     }  
       
     while (s>0 && v[s]>x)  
         --s;  
     if (s)  
         return s;  
     return -1;  
 }  
   
 int serci2(int x)  
 {  
     int s,e,m;  
       
     s=1; e=n; m=(s+e)/2;  
       
     while (s!=e)  
     {  
         if (x<v[m])  
             e=(s+e)/2;  
         else  
             s=(s+e)/2+1;  
         m=(s+e)/2;  
     }  
     s--;  
     while (v[s]==v[s-1])  
         s--;  
       
     while (s<=n && v[s]<x)  
         ++s;  
     if (s<=n)  
         return s;  
     return -1;  
 }  
   
 void rezolv()  
 {     
     int i,a,b,k;  
       
     for (i=0; i<M; ++i)  
     {  
         fscanf(in,"%d%d",&a,&b);  
           
         if (a==0)  
         {  
             k=serci0(b);  
             fprintf(out,"%d\n",k);  
         }  
         if (a==1)  
         {  
             k=serci1(b);  
             fprintf(out,"%d\n",k);            
         }  
         if (a==2)  
         {  
             k=serci2(b);  
             fprintf(out,"%d\n",k);  
         }  
     }  
   
     fclose(in);  
     fclose(out);  
 }  
   
 int main()  
 {  
       
     citire();  
     rezolv();  
       
     return 0;  
 }