Cod sursa(job #1450305)

Utilizator PlatonVPlaton Vlad PlatonV Data 12 iunie 2015 15:54:15
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>

using namespace std;

int N, a[100000];

void read()
{
    scanf("%d", &N);
    for (int i = 0; i < N; ++i)
        scanf("%d", &a[i]);
}

int binara1(int x)
{
    int st = 0;
    int dr = N-1;

    while (dr - st > 0)
    {
        int mij = (st + dr) / 2;

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

int binara2(int x)
{
    int st = 0;
    int dr = N-1;
    while (dr - st > 0)
    {
        int mij = (st + dr) / 2;

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

int binara3(int x)
{
    int st = 0;
    int dr = N-1;

    while (dr - st > 0)
    {
        int mij = (st + dr) / 2;

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

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

    read();

    int k;
    scanf("%d", &k);
    for (int o = 0; o < k; ++o)
    {
        int instr, val;
        scanf("%d%d", &instr, &val);
        if (instr == 0)
            printf("%d\n", binara1(val));
        else if (instr == 1)
            printf("%d\n", binara1(val));
        else 
            printf("%d\n", binara1(val));
    }
    return 0;
}