Cod sursa(job #2445868)

Utilizator D3eD3eCristina D3eD3e Data 5 august 2019 20:13:59
Problema Cautare binara Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <stdlib.h>

int cautareBinaraLast(int *v, int p, int q, int x)
{
    if (p > q)
    {
        return -1;
    }
    int m = (p + q) / 2;
    if (v[m] == x)
    {
        if (v[m + 1] == x)
        {
            return cautareBinaraLast(v, m + 1, q, x);
        }
        else
        {
            return m;
        }
    }
    if (v[m] > x)
    {
        return cautareBinaraLast(v, p, m - 1, x);
    }
}

int cautareBinaraFirst(int *v, int p, int q, int x)
{
    if (p > q)
    {
        return -1;
    }
    int m = (p + q) / 2;
    if (v[m] == x)
    {
        if (v[m - 1] == x)
        {
            return cautareBinaraFirst(v, p, m - 1, x);
        }
        else
        {
            return m;
        }
    }
    if (v[m] < x)
    {
        return cautareBinaraFirst(v, m + 1, q, x);
    }
}

int main()
{

    FILE *in, *out;
    in = fopen("cautbin.in", "r");
    out = fopen("cautbin.out", "w");

    int N, M, v[1000], i, type, x, res;

    fscanf(in, "%d", &N);
    for (i = 1; i <= N; i++)
    {
        fscanf(in, "%d", &v[i]);
    }

    fscanf(in, "%d", &M);
    for (i = 1; i <= M; i++)
    {
        fscanf(in, "%d %d", &type, &x);
        if ((type == 0) || (type == 1))
        {
            res = cautareBinaraLast(v, 1, N, x);
            fprintf(out, "%d\n", res);
        }
        else
        { // type == 2
            res = cautareBinaraFirst(v, 1, N, x);
            fprintf(out, "%d\n", res);
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}