Cod sursa(job #1691261)

Utilizator fotadavidFota David fotadavid Data 17 aprilie 2016 18:05:01
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>

using namespace std;
int v[100005];
int INTREBARE_0( int x, int n)
{
    int a = 1, b = n, rasp = -1;
    while(a <= b)
    {
        int m = (a + b) / 2;
        if( v[m] > x )
            b = m - 1;
        else if( v[m] < x )
            a = m + 1;
        else if( v[m] == x )
        {
            rasp = m;
            a = m + 1;
        }
    }
    return rasp;
}
int INTREBARE_1( int x, int n )
{
    int pow = 1 << 16, rez = 1;
    while(pow > 0)
    {
        if(pow + rez <= n && v[pow + rez] <= x)
            rez += pow;
        pow >>= 1;
    }
    return rez;
}
int INTREBARE_2( int x, int n )
{
    int pow = 1 << 16, rez = 0;
    while(pow > 0)
    {
        if( pow + rez <= n && v[pow + rez] < x )
            rez += pow;
        pow >>= 1;
    }
    return rez + 1;
}
int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    int n, m, r;
    scanf("%d", &n);
    for( int i = 1; i <= n; i++ )
        scanf("%d", &v[i]);
    scanf("%d", &m);
    for( int i = 1; i <= m; i++ )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        if( a == 0 )
        {
            r = INTREBARE_0( b, n );
            printf("%d\n", r);
        }else if( a == 1 )
        {
            r = INTREBARE_1( b, n );
            printf("%d\n", r);
        }else{
            r = INTREBARE_2( b, n );
            printf("%d\n", r);
        }
    }

    return 0;
}