Submission #1207556

#TimeUsernameProblemLanguageResultExecution timeMemory
1207556trimkusCircle Passing (EGOI24_circlepassing)C++20
100 / 100
170 ms4624 KiB
#include <bits/stdc++.h>
using namespace std;



int main() {
	int n, m, q;
	cin >> n >> m >> q;
	vector<int> tel;
	for (int i = 0; i < m; ++i) {
		int a;
		cin >> a;
		tel.push_back(a);
		tel.push_back(a + n);
	}
	sort(begin(tel), end(tel));
	//~ vector<int> l(2 * n), r(2 * n);
	//~ for (int i = 0, j = 0; i < 2 * n; ++i) {
		//~ while (j + 1 < (int)tel.size() && tel[j + 1] <= i) j++;
		//~ l[i] = (tel[j] > i ? tel.back() : tel[j]);
	//~ }
	//~ for (int i = 2 * n - 1, j = tel.size() - 1; i >= 0; --i) {
		//~ while (j - 1 >= 0 && tel[j - 1] >= i) j--;
		//~ r[i] = (tel[j] < i ? tel[0] : tel[j]);
	//~ }
	//~ for (int i = 0; i < 2 * n; ++i) {
		//~ cout << l[i] << " " << r[i] << "\n";
	//~ }
	auto calc = [&](int x, int y) -> int {
		//~ cout << x << " " << y << " -> ";
		if (x >= y) swap(x, y);
		//~ cout << x << " " << y << " dist = " << min(abs(y - x), abs(2 * n + x - y)) << endl;
		return min(abs(y - x), abs(2 * n + x - y));
	};
	auto nxt = [&](int x) -> int {
		return (x + n) % (2 * n);
	};
	while (q--) {
		int a, b;
		cin >> a >> b;
		int res = calc(a, b);
		//~ cout << res << " -> ";
		{
			int l = lower_bound(begin(tel), end(tel), a) - begin(tel);
			if (l == 0) {
				if (tel[0] == a) l = a;
				else l = tel.back();
			} else {
				if (l < (int)tel.size()) l -= (tel[l] != a);
				else l -= 1;
				l = tel[l];
			}
			
			int now = calc(a, l);
			int na = l;
			res = min(res, now + calc(na, b));
			//~ cout << res << "= res \n";
			//~ cout << na << " -> ";
			na = nxt(na);
			//~ cout << na << endl;
			//~ cout << now << " = " << na << " = " << calc(na, b) << endl;
			res = min(res, now + 1 + calc(na, b));
		}
		{
			int r = lower_bound(begin(tel), end(tel), a) - begin(tel);
			if (r == (int)tel.size()) {
				r = tel[0];
			} else {
				r = tel[r];
			}
			int now = calc(a, r);
			int na = r;
			res = min(res, now + calc(na, b));
			na = nxt(na);
			res = min(res, now + 1 + calc(na, b));
		}
		cout << res << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...