Submission #1329431

#TimeUsernameProblemLanguageResultExecution timeMemory
1329431liptonekCircle Passing (EGOI24_circlepassing)C++20
100 / 100
91 ms8352 KiB
#include <bits/stdc++.h>
using namespace std;

long long dist(long long a, long long b, long long mod)
{
    long long d=abs(a-b);

    return min(d,mod-d);
}

void add(long long u, const vector<long long>& s, vector<long long>& cands)
{
    if(s.empty())
    {
        return;
    }

    auto it=lower_bound(s.begin(),s.end(),u);

    if(it==s.end())
    {
        cands.push_back(s.front());
        cands.push_back(s.back());
    }
    else if(it==s.begin())
    {
        cands.push_back(s.front());
        cands.push_back(s.back());
    }
    else
    {
        cands.push_back(*it);
        cands.push_back(*prev(it));
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    long long n,m,q;
    cin>>n>>m>>q;

    long long circle=2*n;

    vector<long long> s;

    s.reserve(2*m);

    for(int i=0; i<m; i++)
    {
        long long k;
        cin>>k;

        s.push_back(k);
        s.push_back(k+n);
    }

    sort(s.begin(),s.end());

    while(q--)
    {
        long long x,y;
        cin>>x>>y;

        long long d=dist(x,y,circle);
        long long prime=(y+n)%circle;

        vector<long long> cands;

        add(x,s,cands);
        add(prime,s,cands);

        long long best=circle;

        for(long long k : cands)
        {
            long long f=dist(x,k,circle)+dist(k,prime,circle);

            if(f<best)
            {
                best=f;
            }
        }

        long long shortcut=best+1;

        cout<<min(d,shortcut)<<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...