Cod sursa(job #194860)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 14 iunie 2008 22:23:59
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
long a[100],n,m,i,x,q,j,mid;
long zero(long st, long dr);
long unu(long st, long dr);
long doi(long st, long dr);
int main()
{   freopen("cautbin.in","r",stdin); freopen("cautbin.out","w",stdout);
    scanf("%ld",&n);
    for(i=1;i<=n;i++) scanf("%ld",&a[i]);
    scanf("%ld",&m);
    for(i=1;i<=m;i++)
    {      scanf("%ld%ld",&q,&x);
           if(q==0){ printf("%ld\n",zero(1,n)); continue;}
           if(q==1){ printf("%ld\n",unu(1,n)); continue;}
           printf("%ld\n",doi(1,n)); continue;
     }
    return 0;
}
long zero(long st, long dr)
{    for(j=1;;j++)
     { if(dr-st==1) return -1;
       mid=st+(dr-st)/2;
       if(a[mid]==x){ while(a[mid]==a[mid+1]) mid++;
                      return mid;
                     }
       if(a[mid]>x){ dr=mid; continue;}
       if(a[mid]<x) st=mid;
     }
}
long unu(long st, long dr)
{    for(j=1;;j++)
     { if(dr-st==1) return st;
       mid=st+(dr-st)/2;
       if(a[mid]==x){ while(a[mid]==a[mid+1]) mid++;
                      return mid;
                     }
       if(a[mid]>x){ dr=mid; continue;}
       if(a[mid]<x) st=mid;
     }
}
long doi(long st, long dr)
{   for(j=1;;j++)
     { if(dr-st==1) return dr;
       mid=st+(dr-st)/2;
       if(a[mid]==x){ while(a[mid]==a[mid+1]) mid++;
                      return mid;
                     }
       if(a[mid]>x){ dr=mid; continue;}
       if(a[mid]<x) st=mid;
     }
}