Submission #1356741

#TimeUsernameProblemLanguageResultExecution timeMemory
1356741hsuan._.0528Circle Passing (EGOI24_circlepassing)C++20
100 / 100
289 ms47536 KiB
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 5e5+10;

int n, m, q;
set<int> st;

int dis(int x){
    return min(x, 2*n-x);
}

int run(int x, int y, int p){
  return dis(abs(x-p)) + dis(abs( (p+n)%(2*n)-y) ) + 1;
}


int f(int x, int y){
  //cout<<x<<" "<<y<<"? : \n";
    auto it = st.lower_bound(x);
    int p=0, d=1e9;
    if(it==st.end()){
        p = *prev(it);
        d = run(x, y, p);
     //   cout<<" ==end "<<p<<" / "<<dis(abs(x-p))<<" "<<dis(abs( (p+n)-y) )<<" +1 = "<<d<<"\n";
    }else if(it==st.begin()){
        p = *it;
        d = run(x, y, p);
        //cout<<" ==beg "<<p<<" / "<<dis(abs(x-p))<<" "<<dis(abs( (p+n)-y) )<<" +1 = "<<d<<"\n";
    }else{
        p = *it;
        d = run(x, y, p);
       // cout<<" >= "<<p<<" / "<<dis(abs(x-p))<<" "<<dis(abs( (p+n)%(2*n)-y) )<<" +1 = "<<d<<"\n";
        p = *prev(it);
        d = min( d, run(x, y, p));
      //  cout<<" < "<<p<<" / "<<dis(abs(x-p))<<" "<<dis(abs( (p+n)-y) )<<" +1 = "<<d<<"\n";
    }
  //  cout<<d<<"\n";
    return d;
}

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

    cin>>n>>m>>q;
    while(m--){
        int a;  cin>>a;
        st.insert(a);
        st.insert(a+n);
    }

    while(q--){
        int x, y;  cin>>x>>y;
        cout<< min({ dis(abs(x-y)), f(x, y), f(y, x) }) <<"\n";

       /* if(x>y)  swap(x, y);
        int d=1e9;
        if(y-x <= n/2 + (n%2)){
          //  cout<<n/2<<" !  ";
            cout<< y-x <<"\n";
        }
        else if(abs(x + 2*n - y) <= n/2 + (n%2)){
         //   cout<<n/2<<" +n  ";
            cout << abs(x + 2*n - y) << "\n";
        }
        else{
         // cout<<x<<" "<<y<<" : \n";
          
            if(x >= n and y >= n){
          //    cout<<">>\n";
                d = min( f(x, y), f(y%n, x%n) );
            }
            else if(y >= n){
            //  cout<<"<>\n";
             // cout<<x<<" "<<y<<"- : \n";
                d = min( f(x, y), f(y%n, x+n) );
            }
            else{
            //  cout<<"<<\n";
                d = min( f(x, y), f(y, x) );
            }
            
        }*/
        
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...