Submission #1247713

#TimeUsernameProblemLanguageResultExecution timeMemory
1247713dbencePictionary (COCI18_pictionary)C++20
140 / 140
110 ms44932 KiB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define len(x) (x).size()
#define lsb(x) (x) & (-x)
#define l(x) (x << 1) + 1
#define r(x) (x << 1) + 2
#define mp make_pair
#define xx first
#define yy second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

template <typename T>
void print(T t) {
    cout << t << "\n";
}

template <typename T, typename... Args>
void print(T t, Args ...args) {
    cout << t << " ";
    print(args...);
}

const int N = 1e5 + 1;
int n, m, q, ci, ans[N];

struct Query {
    int a, b, i;
};
vector <Query> qry;

struct Dsu {
    int cnt[N];
    int par[N];
    vector <pair <pii, pii>> updates;

    void unite(int u, int v) {
        u = root(u);
        v = root(v);
        if (u == v) {
            updates.pb({{u, v}, {cnt[u], par[v]}});
            return;
        }
        if (cnt[u] < cnt[v]) {
            swap(u, v);
        }
        updates.pb({{u, v}, {cnt[u], par[v]}});
        cnt[u] += cnt[v];
        par[v] = u;
    }
    int root(int u) {
        return par[u] == u? u: root(par[u]);
    }
    void rollback() {
        auto p = updates.back();
        updates.pop_back();

        cnt[p.xx.xx] = p.yy.xx;
        par[p.xx.yy] = p.yy.yy;
    }
} dsu;

void add() {
    int i = ++ci;
    int x = m - i + 1;
    for (int i = x; i <= n; i += x) {
        dsu.unite(x, i);
    }
}

void rem() {
    int i = ci--;
    int x = m - i + 1;
    for (int i = x; i <= n; i += x) {
        dsu.rollback();
    }
}

void bin_search(int l, int r, vector <Query> &qry) {
    if (l == r) {
        for (auto p: qry) {
            ans[p.i] = l;
        }
        return;
    }
    vector <Query> lef, rig;

    int mid = l + r >> 1;
    while (ci < mid) add();
    while (ci > mid) rem();
    for (auto &p: qry) {
        if (dsu.root(p.a) == dsu.root(p.b)) {
            lef.pb(p);
        } else {
            rig.pb(p);
        }
    }
    bin_search(l, mid, lef);
    bin_search(mid + 1, r, rig);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin >> n >> m >> q;
    for (int i = 0; i < q; ++i) {
        int a, b;
        cin >> a >> b;
        qry.pb({a, b, i});
    }
    for (int i = 1; i <= n; ++i) {
        dsu.cnt[i] = 1;
        dsu.par[i] = i;
    }
    bin_search(0, m, qry);
    for (int i = 0; i < q; ++i) {
        cout << ans[i] << "\n";
    }
}
#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...