Submission #1169338

#TimeUsernameProblemLanguageResultExecution timeMemory
1169338AmadooPictionary (COCI18_pictionary)C++20
140 / 140
145 ms10016 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "local_debug.cpp"
#else
#define debug(...)
#define debugArr(...)
#endif

#define int         long long
#define nl          '\n'
#define sp          ' '
#define F           first
#define S           second
#define SZ(s)       (int)((s).size())

const int N = 1e5 + 5;

pair <int, int> queries[N];
int ql[N], qr[N], ans[N];

struct DSU {
    vector <int> par, sz;
    DSU(int n) : par(n + 1), sz(n + 1, 1) {
        for(int i = 1; i <= n; ++i) par[i] = i;
    }
    int get(int v) {
        return (par[v] == v ? v : (par[v] = get(par[v])));
    }
    void unite(int u, int v) {
        u = get(u);
        v = get(v);
        if(u != v) {
            if(sz[u] < sz[v]) swap(u, v);
            par[v] = u;
            sz[u] += sz[v];
        }
    }
    bool query(int u, int v) {
        return get(u) == get(v);
    }
};

void solve() {
    int n, m, q; cin >> n >> m >> q;
    for(int i = 1; i <= q; ++i) cin >> queries[i].F >> queries[i].S;
    for(int i = 1; i <= q; ++i) ql[i] = 1, qr[i] = m;
    while(1) {
        bool done = 1;
        vector <int> qm[m + 1];
        for(int i = 1; i <= q; ++i) {
            if(ql[i] > qr[i]) continue;
            done = 0;
            qm[(ql[i] + qr[i]) >> 1].push_back(i);
        }
        if(done) break;
        DSU dsu(n);
        for(int mid = 1; mid <= m; ++mid) {
            int mult = m - mid + 1;
            for(int i = mult; i <= n; i += mult) dsu.unite(mult, i);
            for(auto i : qm[mid]) {
                auto [u, v] = queries[i];
                if(dsu.query(u, v)) ans[i] = mid, qr[i] = mid - 1;
                else ql[i] = mid + 1;
            }
        }
    }
    for(int i = 1; i <= q; ++i) cout << ans[i] << nl;
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int tc = 1;
    // cin >> tc;
    while(tc--) solve();
}
#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...
#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...