Cod sursa(job #223533)

Utilizator Mishu91Andrei Misarca Mishu91 Data 28 noiembrie 2008 19:09:33
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>

#define MAX_N 100005

long V[MAX_N];
int N, logN;

void citire()
{
    scanf("%d",&N);

    for(int i = 0; i < N; ++i)
        scanf("%ld",V+i);
    for(logN = 1; logN < N; logN <<= 1);
}

int b_search1(int x)
{
    int i, lg;

    for(lg = logN, i = 0; lg; lg >>= 1)
        if(i + lg < N && V[i + lg] <= x)
            i += lg;
    return i;
}

int b_search2(int x)
{
    int i, lg;

    for(lg = logN, i = N-1; lg; lg >>= 1)
        if(i - lg >= 0 && V[i - lg] >= x)
            i -= lg;
    return i;
}

void solve()
{
    int tip, nr, poz, t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&tip, &nr);

        if(tip < 2)
            poz = b_search1(nr);
        else
            poz = b_search2(nr);
        if(tip == 0)
            if(V[poz] == nr)
                printf("%d\n",poz + 1);
            else
                printf("-1\n");
        else
            printf("%d\n",poz + 1);
    }
}

int main()
{
    freopen("cautbin.in","rt",stdin);
    freopen("cautbin.out","wt",stdout);

    citire();
    solve();
}