Cod sursa(job #540678)

Utilizator SadmannCornigeanu Calin Sadmann Data 24 februarie 2011 11:22:12
Problema Cautare binara Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>
FILE *in,*out;
int n,m,i,tip,val;
long int v[100001];

int bsearch0(int,int,long int);
int bsearch1(int,int,long int);
int bsearch2(int,int,long int);

int main()
{
    in=fopen("cautbin.in","rt");
    out=fopen("cautbin.out","wt");
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(in,"%ld",&v[i]);
    fscanf(in,"%d",&m);
    while(m--)
    {
        fscanf(in,"%d %d",&tip,&val);
        if(!tip)
            fprintf(out,"%d\n",bsearch0(1,n,val));
        if(tip==1)
            fprintf(out,"%d\n",bsearch1(1,n,val));
        if(tip==2)
            fprintf(out,"%d\n",bsearch2(1,n,val));
    }

    return 0;
}

int bsearch0(int st,int dr,long int key)
{
    int mid;
    while(st<=dr)
    {
        mid=st+(dr-st)/2;
        if(v[mid]<=key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=st+(dr-st)/2;
    if(v[mid]>key)
        mid--;
    if(v[mid]==key)
        return mid;
    return -1;
}

int bsearch1(int st,int dr,long int key)
{
    int mid;
    while(st<dr)
    {
        mid=st+(dr-st)/2;
        if(v[mid]<=key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=st+(dr-st)/2;
    if(v[mid]>key)
        mid--;
    return mid;
}

int bsearch2(int st,int dr,long int key)
{
    int mid;
    while(st<dr)
    {
        mid=st+(dr-st)/2;
        if(v[mid]<key)
            st=mid+1;
        else
            dr=mid-1;
    }
    mid=st+(dr-st)/2;
    if(v[mid]<key)
        mid++;
    return mid;
}