Cod sursa(job #876945)

Utilizator Alexxino7Alexandru Popescu Alexxino7 Data 12 februarie 2013 13:28:48
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
using namespace std;
#define Max 100004

ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

unsigned int N,M,poz[3],X,aux;
unsigned long long V[Max];

void cb0(int left,int right){
    if(left<=right){
        int mid = left + (right-left)/2;
        if(V[mid]<X){
                cb0(mid+1,right);
            }
            if(V[mid]>X){
                cb0(left,mid-1);
            }
            if(V[mid]==X){
                poz[0]=mid;
                cb0(mid+1,right);
            }
    }
}

void cb1(int left, int right){
    if(left<=right){
        int mid = left + (right-left)/2;
        if(V[mid]<=X){
                poz[1]=mid;
                cb1(mid+1,right);
            }
            if(V[mid]>X){
                cb1(left,mid-1);
            }
    }
}

void cb2(int left, int right){
    if(left<=right){
        int mid = left + (right-left)/2;
        if(V[mid]>=X){
                poz[2]=mid;
                cb2(left,mid-1);
            }
            if(V[mid]<X){
                cb2(mid+1,right);
            }
    }
}

int main(){

    fin>>N;
    for(unsigned int i=1;i<=N;i++){
        fin>>V[i];
    }

    fin>>M;
    for(unsigned int i=1;i<=M;i++){
        fin>>aux>>X;
        poz[0]=0;
        if(aux==0)
            cb0(1,N);
        if(aux==1)
            cb1(1,N);
        if(aux==2)
            cb2(1,N);
        if(aux==0 && !poz[0])
            fout<<"-1\n";
        else
            fout<<poz[aux]<<"\n";
    }

    return 0;
}