Cod sursa(job #2619487)

Utilizator adriangh3Adrian Gheorghiu adriangh3 Data 27 mai 2020 19:44:04
Problema Cautare binara Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>
#define MAX 100000

int b_search0(unsigned long int v[], int l, int r, int x, int n)
{
    if (l > r)
        return -1;
    int mid = l + (r - l) / 2;
    if (v[mid] == x && (mid == n - 1 || v[mid + 1] != x))
        return mid;
    return x >= v[mid] ? b_search0(v, mid + 1, r, x, n) : b_search0(v, l, mid - 1, x, n);
}

int b_search1(unsigned long int v[], int l, int r, int x, int n)
{
    if (l > r)
        return -1;
    int mid = l + (r - l) / 2;
    if (v[mid] <= x && (mid == n - 1 || v[mid + 1] > x))
        return mid;
    return x >= v[mid] ? b_search1(v, mid + 1, r, x, n) : b_search1(v, l, mid - 1, x, n);
}

int b_search2(unsigned long int v[], int l, int r, int x)
{
    if (l > r)
        return -1;
    int mid = l + (r - l) / 2;
    if (v[mid] >= x && (mid == 0 || v[mid - 1] < x))
        return mid;
    return x <= v[mid] ? b_search2(v, l, mid - 1, x) : b_search2(v, mid + 1, r, x);
}

int main()
{
    FILE *in = fopen("cautbin.in", "r");
    FILE *out = fopen("cautbin.out", "w");
    int n, m, op, x;
    unsigned long int v[MAX];
    fscanf(in, "%d", &n);
    for (int i = 0; i < n; i++)
        fscanf(in, "%lu", v + i);
    fscanf(in, "%d", &m);
    for (int i = 0; i < m; i++)
    {
        fscanf(in, "%d%d", &op, &x);
        switch (op)
        {
        case 0:
            fprintf(out, "%d\n", b_search0(v, 0, n - 1, x, n) + 1);
            break;
        case 1:
            fprintf(out, "%d\n", b_search1(v, 0, n - 1, x, n) + 1);
            break;
        case 2:
            fprintf(out, "%d\n", b_search2(v, 0, n - 1, x) + 1);
            break;
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}