Cod sursa(job #1693461)

Utilizator sdwolfSDWOLF sdwolf Data 23 aprilie 2016 10:04:34
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.15 kb
#include <stdio.h>
#include <stdlib.h>

int biggest_subject(int *list, int list_length, int subject);
int smaller_than_subject(int *list, int list_length, int subject);
int greather_than_subject(int *list, int list_length, int subject);

int main() {
  FILE *input, *output;
  int list_length, count, result, index, type, subject, position;
  int *list;

  input  = fopen("cautbin.in",  "r");
  output = fopen("cautbin.out", "w");

  fscanf(input, "%d\n", &list_length);

  list = (int*) malloc(sizeof(int) * (list_length - 1));

  for(index = 0; index < list_length; index += 1) {
    fscanf(input, "%d", &list[index]);
  }

  fscanf(input, "%d\n", &count);

  for(index = 0; index < count; index += 1) {
    fscanf(input, "%d %d", &type, &subject);

    switch (type) {
      case 0:
        result = biggest_subject(list, list_length, subject);
        break;
      case 1:
        result = smaller_than_subject(list, list_length, subject);
        break;
      case 2:
        result = greather_than_subject(list, list_length, subject);
        break;
    }

    fprintf(output, "%d\n", result);
  }

  fclose(input);
  fclose(output);

  return 0;
}

int biggest_subject(int *list, int list_length, int subject){
  int min, max, mid;

  min = 0;
  max = list_length - 1;

  while (min <= max) {
    mid = (min + max) / 2;
    if (list[mid] <= subject) {
      min = mid + 1;
    } else {
      max = mid - 1;
    }
  }

  if (list[mid] > subject) mid -= 1;
  if (list[mid] == subject) return mid + 1;
  return -1;
}

int smaller_than_subject(int *list, int list_length, int subject){
  int min, max, mid;

  min     = 0;
  max     = list_length - 1;

  while (min <= max) {
    mid = (min + max) / 2;
    if (list[mid] <= subject) {
      min = mid + 1;
    } else {
      max = mid - 1;
    }
  }

  if (list[mid] > subject) return mid;
  return mid + 1;
}

int greather_than_subject(int *list, int list_length, int subject){
  int min, max, mid;

  min = 0;
  max = list_length - 1;

  while (min < max) {
    mid = (min + max) / 2;
    if (list[mid] < subject) {
      min = mid + 1;
    } else {
      max = mid - 1;
    }
  }

  if (list[mid] >= subject) return mid;
  return mid + 1;
}