package search;

/**
 * @author Nikita Doschennikov (me@fymio.us)
 */
public class BinarySearch {

    public static void main(String[] args) {
        IntList a = new IntList();
        int x = Integer.parseInt(args[0]);

        int n = args.length;

        for (int i = 1; i < n; i++) {
            a.put(Integer.parseInt(args[i]));
        }

        System.out.println(searchRecursive(x, a));
        // System.out.println(searchIterative(x, a));
    }

    static int searchIterative(int x, IntList a) {
        if (a.getLength() == 0) {
            return 0;
        }

        int low = 0,
            high = a.getLength() - 1;

        while (low <= high) {
            int mid = low + (high - low) / 2;

            if (a.get(mid) <= x) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }

        return low;
    }

    static int searchRecursive(int x, IntList a) {
        return searchRecursiveHelper(x, a, 0, a.getLength() - 1);
    }

    private static int searchRecursiveHelper(
        int x,
        IntList a,
        int low,
        int high
    ) {
        if (low > high) {
            return low;
        }

        int mid = low + (high - low) / 2;

        if (a.get(mid) <= x) {
            return searchRecursiveHelper(x, a, low, mid - 1);
        } else {
            return searchRecursiveHelper(x, a, mid + 1, high);
        }
    }
}
