Submission #1229054

#TimeUsernameProblemLanguageResultExecution timeMemory
1229054gry3125Circle Passing (EGOI24_circlepassing)C++20
31 / 100
217 ms16920 KiB
#include <bits/stdc++.h>
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define ll long long int
using namespace std;

ll n, m, q;

ll d(ll x, ll y) {
	if (x >= 2*n) x -= 2*n;
	if (y >= 2*n) y -= 2*n;
	if (x < y) swap(x, y); // x > y
	return min(x-y, 2*n-(x-y));
}

int main() {
    cin >> n >> m >> q;
    vector<ll> e;
    for (ll i = 0; i < m; i++) {
        ll x; cin >> x;
        e.pb(x); e.pb(x+n); e.pb(x+2*n);
    }
    sort(all(e));
    
    while (q--) {
        ll x, y; cin >> x >> y; 
        if (x < y) swap(x, y); // x > y
        ll ans = d(x, y); // no jump
        
        if (1) {
	        ll L = 0, R = 2*m-1;
	        while (L < R) {
	        	ll m = (L + R + 1) / 2;
	        	if (e[m] > x) R = m-1;
	        	else L = m;
	        }
	        ll d1, d2;
	        if (e[L] >= 2*n) {
	        	d1 = e[L] - 2*n;
	        	d2 = e[L] - n;
	        } else if (e[L] < n) {
	        	d1 = e[L]; 
	        	d2 = e[L] + n;
	        } else {
	        	d1 = e[L];
	        	d2 = e[L] - n;
	        }
	        ans = min(ans, d(x, d1)+d(y, d2)+1);
        }
        
        if (1) {
	        ll L = 0, R = 2*m-1;
	        while (L < R) {
	        	ll m = (L + R) / 2;
	        	if (e[m] < x) L = m+1;
	        	else R = m;
	        }
	        ll d1, d2;
	        if (e[L] >= 2*n) {
	        	d1 = e[L] - 2*n;
	        	d2 = e[L] - n;
	        } else if (e[L] < n) {
	        	d1 = e[L]; 
	        	d2 = e[L] + n;
	        } else {
	        	d1 = e[L];
	        	d2 = e[L] - n;
	        }
	        ans = min(ans, d(x, d1)+d(y, d2)+1);
        }
        
        cout << ans << "\n";
    }
    return 0;
}
#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...