Submission #1151523

#TimeUsernameProblemLanguageResultExecution timeMemory
1151523hynmjCircle Passing (EGOI24_circlepassing)C++20
14 / 100
46 ms6036 KiB
//~~~~~~~~~~~~~MJ®™~~~~~~~~~~~~~
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
#define rep1(n) for(ll i=0; i<(ll)(n); ++i)
#define rep2(i,n) for(ll i=0; i<(ll)(n); ++i)
#define rep3(i,a,b) for(ll i=(ll)(a); i<(ll)(b); ++i)
#define rep4(i,a,b,c) for(ll i=(ll)(a); i<(ll)(b); i+=(c))
#define cut4(a,b,c,d,e,...) e
#define rep(...) cut4(__VA_ARGS__,rep4,rep3,rep2,rep1)(__VA_ARGS__)
#define per1(n) for(ll i=((ll)n)-1; i>=0; --i)
#define per2(i,n) for(ll i=((ll)n)-1; i>=0; --i)
#define per3(i,a,b) for(ll i=((ll)a)-1; i>=(ll)(b); --i)
#define per4(i,a,b,c) for(ll i=((ll)a)-1; i>=(ll)(b); i-=(c))
#define per(...) cut4(__VA_ARGS__,per4,per3,per2,per1)(__VA_ARGS__)
#define ll long long
#define ln cout<<endl
#define int long long
#define vv vector<vi>
#define vp vector<pi>
#define append push_back
#define all(x) (x).begin(),(x).end()
#define allr(x) (x).rbegin(),(x).rend()
#define vi vector<int>
#define ret(x) {cout<<x;return;}
#define ui map<int,int>
#define pi pair<int,int>
#define ff first
#define ss second
using namespace std;
const int INF = 1e18, MOD = 1e9+7, N = 2e5+7;
// 4 ways to consider
// GOING WITHOUT BRIDGE
// go clockwise
// go anticlockwise
// GOING WITH BRIDGE
// go clockwise and use bridge a[i] to a[i+n]
// go anticlockwise and use bridge a[i] to a[i+n]
void solve()
{
    int n, k, e, m, ans = INF;
    int queries;
    cin >> n >> m >> queries;
    vi bridges(m);
    rep(m)
    {
        cin >> bridges[i];
        bridges.append(bridges[i]+n);
    }
    sort(all(bridges));
    int start, end;
    rep(queries)
    {
        int ans= INF;
        cin >> start >> end;
        if (start > end) swap(start, end);
        ans = min(ans, abs(end-start));
        ans = min(ans, abs(2*n+start-end));
        auto it = lower_bound(all(bridges), start);
        if (it != bridges.end())
        {
            ans = min(ans, abs(*it-start)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start)+abs(*it-end)+1);

            ans = min(ans, abs(*it-start+2*n)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start+2*n)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start+2*n)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start+2*n)+abs(*it-end)+1);

        }
        else 
        {
            auto it = bridges.begin();
            
            ans = min(ans, abs(*it-start)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start)+abs(*it-end)+1);
            
            ans = min(ans, abs(*it-start+2*n)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start+2*n)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start+2*n)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start+2*n)+abs(*it-end)+1);
        }
        if (it != bridges.begin())
        {
            it--;
            ans = min(ans, abs(*it-start)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start)+abs(*it-end)+1);

            ans = min(ans, abs(*it-start+2*n)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start+2*n)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start+2*n)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start+2*n)+abs(*it-end)+1);

        }
        else 
        {
            auto it = bridges.rbegin();
            
            ans = min(ans, abs(*it-start)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start)+abs(*it-end)+1);
            
            ans = min(ans, abs(*it-start+2*n)+abs(*it+n-end)+1);
            ans = min(ans, abs(*it+n-start+2*n)+abs(*it-end)+1);
            ans = min(ans, abs(*it-start+2*n)+abs(*it-n-end)+1);
            ans = min(ans, abs(*it-n-start+2*n)+abs(*it-end)+1);

        }
         cout << ans;ln;
    }
    






    // cout << a.size();
    // for (auto i: a){cout << i << " ";}
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL); cout.tie(NULL);
    int ans=1;
    //cout<<setprecision(1000);
    // cin>>ans;
    rep(ans){
        // cout << "Case #" << i+1 << ": ";
        solve();ln;}}
#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...