ChallaAjay's blog

By ChallaAjay, history, 85 minutes ago, In English

Alright, round 4.

This time it's binary search. The code looks normal, the idea seems reasonable, and it even works on the examples I tried.

But I'm pretty sure there's a test case waiting to ruin my day.

The problem

You are given a sorted array of n integers and an integer x.

Find the index of the first element that is greater than or equal to x. If no such element exists, print -1.

Use 0-based indexing.

My solution

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;

    vector<int> a(n);
    for (int &i : a) cin >> i;

    int l = 0, r = n - 1, ans = -1;

    while (l < r) {
        int mid = (l + r) / 2;

        if (a[mid] >= x) {
            ans = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }

    cout << ans << '\n';
}

The idea is simple: if a[mid] is at least x, save that position and search to the left. Otherwise, search to the right.

Pretty standard binary search, right?

Your mission

Find the smallest counterexample you can.

  • Give an input for which my code prints the wrong answer.
  • Explain exactly why it fails.
  • Fix the code with as few changes as possible.
  • Bonus: can you explain what invariant a correct binary search should maintain?

Please don't just say "use lower_bound." I know it exists. I want to see the actual bug.

Let's see who catches it first.

  • Vote: I like it
  • -2
  • Vote: I do not like it