更近的可传点与更远的可传点等价或更优。
每次找到左侧最近的可传点与右侧最近的可传点,与直接走的距离比较即可。
## Code:
```cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1000050;
int n, m, q, x, y;
int arr[N], iarr[N];
int dis(int a, int b){
return min(abs(a - b), n * 2 - abs(a - b));
}
int change(int a){
if(a < n) return a + n;
return a - n;
}
int main() {
cin >> n >> m >> q;
for(int i = 1; i <= m; i ++){
cin >> arr[i];
arr[i + m] = arr[i] + n;
}
sort(arr + 1, arr + 2 * m + 1);
for(int i = 1; i <= 2 * m; i ++)
iarr[i] = -arr[i];
reverse(iarr + 1, iarr + 2 * m + 1);
for(int i = 1; i <= q; i ++){
cin >> x >> y;
int ne = lower_bound(arr + 1, arr + 2 * m + 1, x) - arr;
if(ne > 2 * m) ne = 1;
int la = lower_bound(iarr + 1, iarr + 2 * m + 1, -x) - iarr;
if(la > 2 * m) la = 1;
cout << min({dis(x, y), dis(x, -iarr[la]) + dis(change(-iarr[la]), y) + 1, dis(x, arr[ne]) + dis(change(arr[ne]), y) + 1}) << endl;
}
return 0;
}
```