Cod sursa(job #2194042)

Utilizator ibicecIT Zilla ibicec Data 11 aprilie 2018 23:26:29
Problema Cautare binara Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 3.06 kb
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new FileReader("cautbin.in"));
        PrintWriter printWriter = new PrintWriter("cautbin.out");
        int n = scanner.nextInt();
        int arr[] = new int[n];
        for (int i=0; i<n; i++) {
            arr[i] = scanner.nextInt();
        }
        int m = scanner.nextInt();
        for (int i=0; i<m; i++) {
            int operation = scanner.nextInt();
            int find = scanner.nextInt();
            switch (operation) {
                case 0:
                    printWriter.println(binarySearchFindLast(arr, find)+1);
                    break;
                case 1:
                    printWriter.println(binarySearchFindLastLtEq(arr, find)+1);
                    break;
                case 2:
                    printWriter.println(binarySearchFindFirstGtEq(arr, find)+1);
                    break;
            }
        }
        scanner.close();
        printWriter.close();
    }

    static int binarySearchFindLast(int arr[], int n) {
        Objects.requireNonNull(arr);
        if (arr.length == 0) {
            throw new IllegalArgumentException("zero sized array provided");
        }

        int lastPositionFound = -1;

        int lower = 0;
        int upper = arr.length-1;
        while (lower <= upper) {
            int middle = lower+(upper-lower)/2;

            if (arr[middle] >= n) {
                lower = middle+1;
                if (arr[middle] == n) {
                    lastPositionFound = middle;
                }
            } else {
                upper = middle-1;
            }
        }

        return lastPositionFound;
    }

    static int binarySearchFindLastLtEq(int arr[], int n) {
        Objects.requireNonNull(arr);
        if (arr.length == 0) {
            throw new IllegalArgumentException("zero sized array provided");
        }

        int lastPositionFound = -1;

        int lower = 0;
        int upper = arr.length-1;
        while (lower <= upper) {
            int middle = lower+(upper-lower)/2;

            if (arr[middle] <= n) {
                lastPositionFound = middle;
                lower = middle+1;
            } else {
                upper = middle-1;
            }
        }

        return lastPositionFound;
    }

    static int binarySearchFindFirstGtEq(int arr[], int n) {
        Objects.requireNonNull(arr);
        if (arr.length == 0) {
            throw new IllegalArgumentException("zero sized array provided");
        }

        int lastPositionFound = -1;

        int lower = 0;
        int upper = arr.length-1;
        while (lower <= upper) {
            int middle = lower+(upper-lower)/2;

            if (arr[middle] >= n) {
                lastPositionFound = middle;
                upper = middle-1;
            } else {
                lower = middle+1;
            }
        }

        return lastPositionFound;
    }



}