Cod sursa(job #1106950)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 13 februarie 2014 13:56:49
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int main()
{
    int j,x,m,a,b,s,d,i,n;
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&v[i]);
    scanf("%d",&m);
    x=m;
    for(i=0; i<x; i++){
        scanf("%d%d",&a,&b);
        switch(a){
            case 0:
            s=1;
            d=n;
            m=n/2;
            while(abs(d-s)>1 && v[m]!=b){
                if(b<v[m])
                    d=m,m=(s+d)/2;
                else
                    s=m,m=(s+d)/2;
            }
            if(v[m]!=b)
                printf("-1\n");
            else
                {
                    j=m;
                    while(v[j]==b)
                        j++;
                    printf("%d\n",j-1);
                }
            break;
            case 1:
            s=1;
            d=n;
            m=n/2;
            while(abs(d-s)>1 && v[m]!=b){
                if(b<v[m])
                    d=m,m=(s+d)/2;
                else
                    s=m,m=(s+d)/2;
            }
            if(v[m]!=b)
                printf("%d\n",m-1);
            else{
                while(v[m]==b)
                    m++;
                printf("%d\n",m-1);
            }
            break;
            case 2:
            s=1;
            d=n;
            m=n/2;
            while(abs(d-s)>1 && v[m]!=b){
                if(b<v[m])
                    d=m,m=(s+d)/2;
                else
                    s=m,m=(s+d)/2;
            }
            if(v[m]!=b)
                printf("%d\n",m+1);
            else
                printf("%d\n",m);
        }
    }

    return 0;
}