#include <bits/stdc++.h>
#define N 100050
#define logn 20
#define f first
#define s second
using namespace std;
typedef pair<int, int> pii;
int n, m, q, id, pai[N], peso[N], nivel[N], anc[N][logn], best[N][logn];
vector<pii> grafo[N];
void dfs(int x, int p)
{
nivel[x] = nivel[p] + 1;
anc[x][0] = p;
for(auto v: grafo[x])
{
if(v.f == p) continue;
dfs(v.f, x);
best[v.f][0] = v.s;
}
}
int query(int u, int v)
{
if(nivel[u] < nivel[v]) swap(u, v);
int resp = m;
for(int i = logn - 1; i >= 0; i--)
if(nivel[u] - (1<<i) >= nivel[v])
resp = min(resp, best[u][i]), u = anc[u][i];
if(u == v) return resp;
for(int i = logn - 1; i >= 0; i--)
if(anc[u][i] != -1 && anc[u][i] != anc[v][i])
resp = min(min(resp, best[u][i]), best[v][i]), u = anc[u][i], v = anc[v][i];
return min(min(resp, best[u][0]), best[v][0]);
}
int Find(int x)
{
if(x == pai[x]) return x;
return pai[x] = Find(pai[x]);
}
void join(int a, int b)
{
a = Find(a), b = Find(b);
if(a == b) return;
if(peso[a] > peso[b]) pai[b] = a;
else if(peso[a] < peso[b]) pai[a] = b;
else pai[a] = b, peso[b] ++;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m>>q;
for(int i = 1; i <= n; i++) pai[i] = i;
for(int i = m; i >= 1; i--)
{
for(int j = 1; i * j <= n; j++)
{
if(Find(i) == Find(i*j)) continue;
join(i, i*j);
grafo[i].push_back({i*j, i});
grafo[i*j].push_back({i, i});
}
}
memset(anc, -1, sizeof anc);
dfs(1, 1);
for(int j = 1; j < logn; j++)
{
for(int i = 1; i <= n; i++)
{
if(anc[i][j - 1] != -1) anc[i][j] = anc[anc[i][j - 1]][j - 1];//anc[anc[i][j - 1]][j - 1];
if(anc[i][j - 1] != -1) best[i][j] = min(best[anc[i][j - 1]][j - 1], best[i][j - 1]);
}
}
for(int i = 1, u, v; i <= q; i++)
{
cin>>u>>v;
int ans = query(u, v);
cout<<m - ans + 1<<'\n';
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
10616 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
10876 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
42 ms |
11056 KB |
Output is correct |
2 |
Correct |
38 ms |
11096 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
52 ms |
11304 KB |
Output is correct |
2 |
Correct |
47 ms |
11304 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
48 ms |
14352 KB |
Output is correct |
2 |
Correct |
44 ms |
14796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
55 ms |
16568 KB |
Output is correct |
2 |
Correct |
59 ms |
17756 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
78 ms |
20024 KB |
Output is correct |
2 |
Correct |
64 ms |
20676 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
94 ms |
23596 KB |
Output is correct |
2 |
Correct |
121 ms |
25604 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
124 ms |
27708 KB |
Output is correct |
2 |
Correct |
132 ms |
30348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
157 ms |
32876 KB |
Output is correct |
2 |
Correct |
153 ms |
34096 KB |
Output is correct |