제출 #1166015

#제출 시각아이디문제언어결과실행 시간메모리
1166015bluocarootPictionary (COCI18_pictionary)C++20
140 / 140
169 ms6956 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using ll = long long;
using namespace std;
using namespace __gnu_pbds;

template<typename T> using ordered_set = tree<
        T,
        null_type,
        less<T>,
        rb_tree_tag,
        tree_order_statistics_node_update>;

/*
 * this comment fills you with Determination.
 */
const int N = 1e5 + 7;
int sz[N], par[N];

void init(int n) {
    for (int i = 0; i < n; ++i)
        par[i] = -1, sz[i] = 0;
}

int parent(int u) {
    if (par[u] == -1)
        return u;
    else
        return par[u] = parent(par[u]);
}

bool is_united(int u, int v) {
    u = parent(u);
    v = parent(v);
    return (u == v);
}

bool unite(int u, int v) {
    u = parent(u);
    v = parent(v);
    if (u == v)
        return false;
    if (sz[u] < sz[v])
        swap(u, v);
    par[v] = u;
    sz[u] += sz[v];
    return true;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
#ifdef CAROOT
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    int tt = 1;
//    cin >> tt;

    for (int tc = 1; tc <= tt; ++tc) {
        int n, m, q;

        cin >> n >> m >> q;
        vector<pair<int, int>> queries(q);
        for (auto &[a, b]: queries)
            cin >> a >> b;
        vector<int> l(q, 1), r(q, m), ans(q);
        bool lessa = true;
        while (lessa) {
            lessa = false;
            vector<vector<int>> mids(m + 1);
            for (int i = 0; i < q; ++i) {
                if (l[i] <= r[i]) {
                    lessa = true;
                    mids[(l[i] + r[i]) / 2].push_back(i);
                }
            }
            init(n + 1);
            for (int mid = m; mid > 0; --mid) {
                for (int j = mid * 2; j <= n; j += mid)
                    unite(mid, j);
                for (auto i: mids[mid]) {
                    int a = queries[i].first;
                    int b = queries[i].second;
                    if (is_united(a, b))
                        l[i] = mid + 1, ans[i] = m - mid + 1;
                    else
                        r[i] = mid - 1;
                }
            }
        }
        for (auto &i : ans)
            cout << i << '\n';
        cout << '\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...
#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...