제출 #1344069

#제출 시각아이디문제언어결과실행 시간메모리
1344069kokorooCircle Passing (EGOI24_circlepassing)C++20
100 / 100
88 ms8768 KiB
#include<bits/stdc++.h>
//#include<atcoder/all>

using namespace std;
//using namespace atcoder;
#define rep(i,n) for(ll i=0; i<n; i++)
#define rrep(i,n) for(ll i=n-1; i>=0; i--)
#define print(a) cout<<a<<endl
typedef long long ll;
#define yn(flg) if(flg){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}
#define YN(flg) if(flg){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}
#define so(a) sort(a.begin(),a.end())
#define mp make_pair
#define vi vector<int>
#define vl vector<ll>
#define vs vector<string>
#define pb push_back
#define a2i(a,s) (ll)(a-s)
#define i2a(s,a) (char)(s+a)
#define ssize(a) a.size()
typedef pair<int, int> Pii;
typedef pair<int, ll> Pil;
typedef pair<pair<ll,ll>,ll> P3;
typedef pair<pair<ll,ll>,pair<ll,ll>> P4;

typedef pair<ll, ll> Pll;
typedef pair<ll,Pll> Plll;
typedef pair<Pii, int> Piii;
const ll INF = 1000000000000000000;

template<class T> inline bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;

}
using ull=unsigned long long;

int main(){
//入力

	cin.tie(0);
	ios::sync_with_stdio(0);

	ll n,m,q;
	cin>>n>>m>>q;

	vector<ll> v;
	rep(i,m){
		ll x;
		cin>>x;
		v.push_back(x);
		v.push_back(x+n);
	}

	sort(v.begin(),v.end());
//判定
	for(ll i=0;i<q;i++){
		ll a,b;
		cin>>a>>b;
		if(a>b)swap(a,b);
		ll ans=INF;
		ans=min(ans,abs(b-a));
		ans=min(ans,abs(a+2*n-b));


		ll l=upper_bound(v.begin(),v.end(),a)-v.begin();
		if(l==0)l=2*m-1;
		else l--;
		ll r=upper_bound(v.begin(),v.end(),a)-v.begin();
		if(r==2*m)r=0;

		ll ansl=min(abs(v[l]-a),abs(min(v[l],a)+2*n-max(a,v[l])));//そこにいくまでの距離
		ll ansr=min(abs(v[r]-a),abs(min(v[r],a)+2*n-max(a,v[r])));
		ll ansl2=min(abs((v[l]+n)-b),abs(min(v[l]+n,b)+2*n-max(b,v[l]+n)));//そこからゴールまでの距離
		ll ansr2=min(abs((v[r]+n)-b),abs(min(v[r]+n,b)+2*n-max(b,v[r]+n)));//そこからゴールまでの距離

//		if(i==0)cout<<v[l]<<endl;

		ans=min({ansl+ansl2+1,ansr+ansr2+1,ans});
//		if(i==1)cout<<ansr<<" "<<ansr2<<endl;

		cout<<ans<<endl;
	}


	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...