public class Main {

    /**
     * 查找第一个大于等于val的位置
     * @param arr
     * @param val
     * @return
     */
    private static int lowerBound(int[] arr, int val) {

        int len = arr.length;
        int start = 0;

        while (len > 0) {
            int half = len >> 1;
            int m = start + half;

            if (arr[m] < val) {
                len = len - half - 1;
                start = m + 1;
            } else {
                len = half;
            }
        }
        return start;
    }

    /**
     * 查找第一个大于val的位置
     * @param arr
     * @param val
     * @return
     */
    private static int upperBound(int[] arr, int val) {

        int len = arr.length;
        int start = 0;

        while (len > 0) {
            int half = len >> 1;
            int m = start + half;

            if (arr[m] <= val) {
                len = len - half - 1;
                start = m + 1;
            } else {
                len = half;
            }
        }
        return start;
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 2, 3, 4, 5};
        System.out.println(upperBound(arr, 5));
    }
}