import java.util.List;
import java.util.ArrayList;

public final class GenericBinary {

   public static <T extends Comparable<T>> int search (final T v, final List<T> data) {
      return search (v, data, 0, data.size());
   }

   // Search everything from 'first' to 'last-1' (inclusive)
   public static <T extends Comparable<T>> int search (final T v, final List<T> data, final int first, final int last) {
      assert 0<=first && first<=data.size();
      assert 0<=last && last<=data.size();
      int low = first, high = last-1;
      while (low <= high) {
         final int mid = (low+high)>>>1;  // works even when + overflows
         if (data.get(mid).compareTo(v) == 0) {
            return mid;    // EXIT; v found
         } else if (data.get(mid).compareTo(v) < 0) {
            System.out.printf ("data[%d]=%d is too low%n", mid, data.get(mid));
            low = mid+1;
         } else {
            assert data.get(mid).compareTo(v) > 0;
            System.out.printf ("data[%d]=%d is too high%n", mid, data.get(mid));
            high = mid-1;
         }
      }
      return -1;  // v not found [TODO:  (-(insertion point) - 1)?]
   }

   public static void main (final String [] args) {
      final List<Integer> data  = new ArrayList<>();
      final int v = Integer.parseInt (args[0]);
      int n = 0;
      for (int i=1; i<args.length; i++) {
         try {
            data.add ( Integer.parseInt (args[i]));
         } catch (NumberFormatException ex) {
            ex.printStackTrace (System.err);
         }
      }
      final int i = search (v, data);
      if (i==-1) {
         System.out.printf ("%d not found%n", v);
      } else {
         System.out.printf ("%d found at index %d%n", v, i);
      }
   }
}