Cod sursa(job #2074527)

Utilizator TudorNicorescuNicorescu Tudor TudorNicorescu Data 24 noiembrie 2017 18:41:30
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100001
#define L 16;

int n, v[N];

int count0(int x)
{
    int r = 0, pass = 1 << L;
    while(pass != 0)
    {
        if(r + pass <= n && v[r + pass] <= x)
        {
            r += pass;
        }
        pass /= 2;
    }
    if(v[r] != x)
    {
        r = -1;
    }
    return r;
}

int count1(int x)
{
    int r = 0, pass = 1 << L;
    while(pass != 0)
    {
        if(r + pass <= n && v[r + pass] <= x)
        {
            r += pass;
        }
        pass /= 2;
    }

    return r;
}

int count2(int x)
{
    int r = 0, pass = 1 << L;
    while(pass != 0)
    {
        if(r + pass <= n && !(v[r + pass] >= x))
        {
            r += pass;
        }
        pass /= 2;
    }
    r++;
    return r;
}

int main()
{
    int m, tip, x;
    //ifstream in("coutbin.in");
    //ofstream out("coutbin.out");
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    scanf("%d ", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d ", &v[i]);
    }
    scanf("%d ", &m);
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d %d", &tip, &x);

        if(tip == 0)
        {
            printf("%d\n", count0(x));
        }
        else if(tip == 1)
        {
            printf("%d\n", count1(x));
        }
        else
        {
            printf("%d", count2(x));
        }
    }
    return 0;
}