Submission #1326532

#TimeUsernameProblemLanguageResultExecution timeMemory
1326532lknijikaijichiPictionary (COCI18_pictionary)C++20
140 / 140
161 ms7040 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int vsz = 1e5 + 5;

#define all(v) v.begin(), v.end()
#define ll long long
#define endl "\n"

template <typename T>
using vec = vector<T>;

int n, m, q, l[vsz], r[vsz], ans[vsz];

struct query {
    int a, b;
} queries[vsz];

struct DSU {
    vec<int> par;
    vec<int> sz;
    DSU(int n) {
        init(n);
    }

    inline void init(int n) {
        sz.assign(n + 1, 1);
        par.resize(n + 1);
        for (int i = 1; i <= n; ++i) {
            par[i] = i;
        }
    }

    int find(int x) {
        return x == par[x] ? x : par[x] = find(par[x]);
    }


    void unite(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) return;
        
        par[b] = a;
        
        sz[a] += sz[b];
    }
};

void solve() {
    cin >> n >> m >> q;

    for (int i = 1; i <= q; ++i) {
        cin >> queries[i].a >> queries[i].b;
        l[i] = 0;
        r[i] = m + 1;
        ans[i] = -1;
    }

    while (true) {
        bool fault = false;

        vec<vec<int>> bucket(m + 1);

        for (int i = 1; i <= q; ++i) {
            if (l[i] + 1 >= r[i]) {
                continue;
            }

            fault = true;

            bucket[(l[i] + r[i]) >> 1].push_back(i);
        }

        if (!fault) break;

        DSU dsu(n);

        for (int i = m; i >= 1; --i) {

            for (int d = i << 1; d <= n; d += i) {
                dsu.unite(d, i);
            }

            for (auto& j : bucket[m - i + 1]) {
                int a = queries[j].a;
                int b = queries[j].b;

                if(dsu.find(a) == dsu.find(b)) {
                    ans[j] = m - i + 1;
                    r[j] = m - i + 1;
                }
                else {
                    l[j] = m - i + 1;
                }
            }
        }
    }

    for(int i = 1; i <= q; ++i) {
        cout << ans[i] << endl;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

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