Submission #1324508

#TimeUsernameProblemLanguageResultExecution timeMemory
1324508haithamcoderCircle Passing (EGOI24_circlepassing)C++20
0 / 100
2093 ms992 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

const ll LOG = 31;
const ll MOD = 1000000007;
const ll inf = 1e17;
const ll B = 2305843009213693951;


#define db(x) cerr << #x << " = " << x << " | "
#define dbg(x) cerr << #x << " = " << x << "\n"

#define Algerian ios::sync_with_stdio(0);
#define OI cin.tie(NULL);

ll d(ll src, ll dst, map<ll, vector<pll>>& adj) {
    priority_queue<pll, vector<pll>, greater<>> pq;

    map<ll, ll> dist;
    dist[src] = 0;
    pq.push({0, src});

    while (pq.size()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d != dist[u]) continue;

        for (auto [v, wt] : adj[u]) {
            if (dist.find(v) == dist.end() || (dist[u] + wt < dist[v])) {
                dist[v] = dist[u] + wt;
                pq.push({dist[v], v});
            }
        }
    }

    return dist[dst];
};

int main() {
    Algerian OI

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

    vector<ll> a(m);
    map<ll, vector<pll>> adj;

    for (ll i = 0; i < m; i++) {
        cin >> a[i];
        adj[a[i]].push_back({a[i] + n, 1});
        adj[a[i] + n].push_back({a[i], 1});
    }

    auto dist = [&](ll a, ll b) -> ll {
        if (a > b) swap(a, b);
        return min(b - a, 2 * n - (b - a));
    };

    for (ll i = 0; i < m - 1; i++) {
        adj[a[i]].push_back({a[i + 1], dist(a[i], a[i + 1])});
        adj[a[i + 1]].push_back({a[i], dist(a[i], a[i + 1])});
        adj[a[i] + n].push_back({a[i + 1] + n, dist(a[i + 1] + n, a[i] + n)});
        adj[a[i + 1] + n].push_back({a[i] + n, dist(a[i + 1] + n, a[i] + n)});
    }

    adj[a[m - 1]].push_back({a[0] + n, dist(a[m - 1], a[0] + n)});
    adj[a[0] + n].push_back({a[m - 1], dist(a[m - 1], a[0] + n)});
    adj[a[0]].push_back({a[m - 1] + n, dist(a[0], a[m - 1] + n)});
    adj[a[m - 1] + n].push_back({a[0], dist(a[0], a[m - 1] + n)});

    while (q--) {
        ll u, v;
        cin >> u >> v;
        if (adj.find(u) == adj.end()) {
            auto it = adj.lower_bound(u);
            ll w = it -> first, w2;
            if (it != adj.begin()) w2 = (--it) -> first;
            else w2 = (--adj.end()) -> first;

            adj[u].push_back({w, dist(u, w)});
            adj[w].push_back({u, dist(u, w)});


            adj[w2].push_back({u, dist(u, w2)});
            adj[u].push_back({w2, dist(u, w2)});
        }
        
        if (adj.find(v) == adj.end()) {
            auto it = adj.lower_bound(v);
            ll w, w2;
            if (it == adj.end()) w = adj.begin() -> first;
            else w = it -> first;

            if (it != adj.begin()) w2 = (--it) -> first;
            else w2 = (--adj.end()) -> first;

            adj[v].push_back({w, dist(v, w)});
            adj[w].push_back({v, dist(v, w)});


            adj[v].push_back({w2, dist(v, w2)});
            adj[w2].push_back({v, dist(v, w2)});
        }

        cout << d(u, v, adj) << "\n";
    }

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