Cod sursa(job #914220)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 13 martie 2013 22:53:21
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>

#define NMAX 100001

using namespace std;

int n;
int a[NMAX];

void read()
{
    scanf("%d\n", &n);

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

int Zero(int x)
{
    int st = 1;
    int dr = n;
    int mij;

    while(st <= dr)
    {
        mij = ((st - dr) >> 1) + dr;

        if(x == a[mij] && (x != a[mij + 1] || mij == n))
            return mij;

        if(x < a[mij])
            dr = mij - 1;
        else
            st = mij + 1;
    }

    return -1;
}

int Unu(int x)
{
    int st = 1;
    int dr = n;
    int mij;

    while(st <= dr)
    {
        mij = ((st - dr) >> 1) + dr;

        if(x >= a[mij] && (x < a[mij + 1] || mij == n))
            return mij;

        if(x < a[mij])
            dr = mij - 1;
        else
            st = mij + 1;
    }

    return -1;
}

int Doi(int x)
{
    int st = 1;
    int dr = n;
    int mij;

    while(st <= dr)
    {
        mij = ((st - dr) >> 1) + dr;

        if(x <= a[mij] && (x > a[mij - 1] || mij == 1))
            return mij;

        if(x > a[mij])
            st = mij + 1;
        else
            dr = mij - 1;
    }

    return -1;
}

int main()
{
    int m;
    int c;
    int x;

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

    read();
    scanf("%d\n", &m);

    while(m --)
    {
        scanf("%d %d\n", &c, &x);

        if(c == 0)
            printf("%d\n", Zero(x));
        else
            if(c == 1)
                printf("%d\n", Unu(x));
            else
                printf("%d\n", Doi(x));
    }

    return 0;
}