Cod sursa(job #1504204)

Utilizator andreitulusAndrei andreitulus Data 17 octombrie 2015 15:08:33
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#include <algorithm>
#define MAX 100003
using namespace std;

int a[MAX], n;


void read()
{
    int i;

    scanf("%d", &n);

    for(i = 1; i <= n; i++)
        scanf("%d", &a[i]);
}


int bin_0(int x)
{
    int i, step;

    for(step = 1; step < n; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= n && a[i + step] <= x)
            i += step;

    if(a[i] == x)
        return i;
    else
        return -1;

}


int bin_1(int x)
{
    int i, step;

    for(step = 1; step < n; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= n && a[i + step] <= x)
            i += step;

    return i;
}


int bin_2(int x)
{
    int i, step, pos;

    for(step = 1; step < n; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= n)
        {
            if(a[i + step] >= x)
                pos = i + step;
            else
                if(a[i + step] < x)
                    i += step;
        }


    return  pos;
}



void solve()
{
    int i, m, sw, r, x;

    scanf("%d", &m);

    for(i = 1; i <= m; i++)
    {
        scanf("%d", &sw);

        if(sw == 0)
        {
            scanf("%d", &x);
            r = bin_0(x);
            printf("%d\n", r);
        }

        else
            if(sw == 1)
            {
                scanf("%d", &x);
                r = bin_1(x);
                printf("%d\n",r);
            }
        else
            {
                scanf("%d",&x);
                r = bin_2(x);
                printf("%d\n", r);
            }
    }
}



int main()
{
    freopen("cautbin.in","r", stdin);
    freopen("cautbin.out","w",stdout);

    read();

    solve();


    fclose(stdin);
    fclose(stdout);
    return 0;
}