Cod sursa(job #2201345)

Utilizator arcoC. Nicolae arco Data 4 mai 2018 13:19:00
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.36 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

typedef unsigned int uint;

int binsearch(int *vector, int low, int high, int key);
int floor_value(int *vector, int low, int high, int key);
int ceil_value(int *vector, int low, int high, int key);

int main(void)
{
    FILE *in = fopen("cautbin.in", "r");
    FILE *out = fopen("cautbin.out", "w");
    if(in != NULL && out != NULL)
    {
        int n, i = 0, vector[100005];
        fscanf(in, "%u%*c", &n);
        for(; i < n; i++)
        {
            fscanf(in, "%u%*c", &vector[i]);
        }
        uint q;
        fscanf(in, "%u%*c", &q);
        i = 0;
        for(; i < q; i++)
        {
            uint x, d;
            fscanf(in, "%u%*c%u%*c", &x, &d);
            int res;
            if(x == 0)
            {
                res = floor_value(vector, 0, n, d);
            }
            else if(x == 1)
            {
                res = floor_value(vector, 0, n, d);
            }
            else
            {
                res = ceil_value(vector, 0, n, d);
            }
            fprintf(out, "%d\n", res + 1);
        }

        fclose(in);
        fclose(out);
    }
    else
    {
        printf("Error\n");
    }

    return 0;
}

int ceil_value(int *vector, int low, int high, int key)
{
    while(high - low > 1)
    {
        int mid = low + (high - low) / 2;
        if(vector[mid] >= key)
        {
            high = mid;
        }
        else
        {
            low = mid;
        }
    }
    return (vector[low] >= key) ? low : high;
}

int floor_value(int *vector, int low, int high, int key)
{
    if(key < vector[0])
    {
        return -1;
    }

    while(high - low > 1)
    {
        int mid = low + (high - low) / 2;
        if(vector[mid] <= key)
        {
            low = mid;
        }
        else
        {
            high = mid;
        }
    }
    return low;
}

int binsearch(int *vector, int low, int high, int key)
{
    while(low <= high)
    {
        int mid = low + (high - low) / 2;
        if(vector[mid] == key)
        {
            return mid;
        }
        else if(key > vector[mid])
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
        }
    }
    return -1;
}