Submission #1147669

#TimeUsernameProblemLanguageResultExecution timeMemory
1147669FZ_LaabidiCircle Passing (EGOI24_circlepassing)C++20
100 / 100
150 ms8436 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, q;
vector<int> k(m);
int binary(int x) {
    int l =0, r = 2*m-1;
    while (abs(l-r)>1) {
        int m = l+(r-l)/2;
        if (k[m]>x) {
            r = m;
        }
        else l = m;
    }
    return r;
}
int mini(int c, int x, int y) {
    int first = min(abs(x-c), 2*n-abs(x-c));
    int vro = (c+n)%(2*n);
    int second = min(abs(y-vro), 2*n-abs(y-vro));
    return first+second+1;
}
signed main() {
    cin >> n >> m >> q;
    k.resize(m);
    for (int i=0; i<m; i++) {
        cin >> k[i];
        k.push_back(k[i]+n);
    }
    sort(k.begin(), k.end());
    for (int i=0; i<q; i++) {
        int x, y; cin >> x >> y;
        int without = min(abs(x-y), 2*n-abs(x-y));
        int ind = binary(x);
        int clo = k[ind], cli;
        if (ind==0)
            cli = k[2*m-1];
        else cli = k[ind-1];
        if(x>=k[2*m-1]|| x<=k[0]) {
          clo = k[2*m-1];
          cli = k[0];
        }
        
        int final = mini(clo, x, y);
        int fin = mini(cli, x, y);
        cout << min(min(final, fin), without) << endl;
    }
}
#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...