很明显,每次二分查找都会将当前区间分成两段,因此我们每次只要把评测程序带到较长的那一段去二分查找就可以了。记得特判给出的二分端点不在当前区间内的情况。

#include <bits/stdc++.h>
using namespace std;
int respond(int n, int q, int x, vector<pair<int, int> > p)
{
	int z = 0;
	int l = 0, r = n + 1;
	for (int i = 1; i <= q; i++)
	{
		if(p[i].second == 0) l = max(l, p[i].first);
		if(p[i].second == 2) r = min(r, p[i].first);
	}
	if (x - l < r - x) z = 0;
	if (x - l > r - x) z = 2;
	if (x - l == r - x && r - l != 2) z = 0;
	if (x - l == r - x && r - l == 2) z = 1;
	return z;
}