Cod sursa(job #675455)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 7 februarie 2012 17:11:06
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
using namespace std;
int n,v[100010];

int caut0(int x,int a,int b){
    if(b-a<=1){
        if(x==v[b]) return b; else
        if(x==v[a]) return a; else return -1;
    }else{
    if(v[a+(b-a)/2]<=x) return caut0(x,a+(b-a)/2,b);
        else return caut0(x,a,a+(b-a)/2);
    }
}

int caut1(int x,int a,int b){
    if(b-a<=1){
        if(v[b]<=x) return b; else return a;
    }else{
    if(v[a+(b-a)/2]<=x) return caut1(x,a+(b-a)/2,b);
        else return caut1(x,a,a+(b-a)/2);
    }
}

int caut2(int x,int a,int b){
    if(b-a<=1){
        if(v[a]>=x) return a; else return b;
    }else{
    if(v[a+(b-a)/2]<x) return caut2(x,a+(b-a)/2,b);
        else return caut2(x,a,a+(b-a)/2);
    }
}

int main(){
    int i,m,x;
    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);
    while(m--){
        scanf("%d",&x);
        switch(x){
            case 0: scanf("%d",&x); printf("%d\n",caut0(x,1,n)); break;
            case 1: scanf("%d",&x); printf("%d\n",caut1(x,1,n)); break;
            case 2: scanf("%d",&x); printf("%d\n",caut2(x,1,n)); break;
        }
    }
}