Cod sursa(job #386347)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 24 ianuarie 2010 18:21:05
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<cstdio>
#include<fstream>
#include<vector>
using namespace std;
vector<int> v;
int n,m,r=-2;

void cb1(int st, int dr, int x)
{
    int m=(st+dr)/2;
    if(x==v[m])
    {
        r=m;
        if(st<dr)
            cb1(m+1,dr,x);
    }
    else if(st==dr);
    else if(x<v[m])
        cb1(st,m-1,x);
    else if(x>v[m])
        cb1(m+1,dr,x);
}


void cb2(int st, int dr, int x)
{
    int m=(st+dr)/2;
    if(x>=v[m])
    {
        r=m;
        if(st<dr)
            cb2(m+1,dr,x);
    }
    else if(st==dr);
    else if(x<v[m])
        cb2(st,m-1,x);
    else if(x>v[m])
        cb2(m+1,dr,x);
}


void cb3(int st, int dr, int x)
{
    int m=(st+dr)/2;
    if(x<=v[m])
    {
        r=m;
        if(st<dr)
            cb3(st,m-1,x);
    }
    else if(st==dr);
    else if(x<v[m])
        cb3(st,m-1,x);
    else if(x>v[m])
        cb3(m+1,dr,x);
}


void citire()
{
    int i,x,y;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        v.reserve(n+5);
        scanf("%d", &x);
        v.push_back(x);
    }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d/n",&x,&y);
        if(x==0)
            cb1(0,n-1,y);
        else if(x==1)
            cb2(0,n-1,y);
        else if(x==2)
            cb3(0,n-1,y);
        printf("%d\n",r+1);

    }
}

int main()
{
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    citire();
    //cautareb();
    return 0;
}