Cod sursa(job #195026)

Utilizator Mishu91Andrei Misarca Mishu91 Data 16 iunie 2008 00:41:28
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#define MAX_N 100001

int N, M, V[MAX_N];

void read(void);
void solve(void);
int BS_0(int);
int BS_1(int);
int BS_2(int);

int main()
{
    freopen("cautbin.in","rt",stdin);
    freopen("cautbin.out","wt",stdout);
    read();
    for(int t = 0; t<M; ++t)
        solve();
}

void read()
{
    scanf("%d\n",&N);
    for(int i = 0; i<N; ++i)
        scanf("%d",V + i);
    scanf("%d",&M);
}

void solve()
{
    int k, x;
    scanf("%d %d",&k,&x);
    if(k == 0)
        printf("%d\n",BS_0(x) + 1);
    if(k == 1)
        printf("%d\n",BS_1(x) + 1);
    if(k == 2)
        printf("%d\n",BS_2(x) + 1);
}

int BS_0(int k)
{
    int li = 0, lf = N;
    while(li <= lf)
    {
        int m = (li + lf) >> 1;
        if(V[m] == k)
            return m;
        if(V[m] < k)
            li = m + 1;
        else
            lf = m - 1;
    }
    return -1;
}

int BS_1(int k)
{
    int li = 0, lf = N;
    while(li <= lf)
    {
        int m = (li + lf) >> 1;
        if(V[m] <= k && ((V[m + 1] > k) || (m + 1 == N)))
            return m;
        if(V[m] > k)
            lf = m - 1;
        else
            li = m + 1;
    }
}

int BS_2(int k)
{
    int li = 0, lf = N;
    while(li <= lf)
    {
        int m = (li + lf) >> 1;
        if(V[m] >= k && ((V[m - 1] < k) || (m == 0)))
            return m;
        if(V[m] > k)
            lf = m - 1;
        else
            li = m + 1;
    }
}