#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pi=pair<int,int>;
#define fi first
#define se second
constexpr int MAXN=1e5+5;
int n,m,q;
vector<int>g[MAXN];
pi que[MAXN];
int ans[MAXN];
int le[MAXN],ri[MAXN];
vector<int>cand[MAXN];
struct dsu{
int n;
vector<int>par;
dsu(){}
dsu(int n):n(n){
par.resize(n+5);
iota(par.begin(),par.end(),0);
}
int find(int x){
if(par[x]==x)return x;
return par[x]=find(par[x]);
}
void join(int a, int b){
a=find(a);
b=find(b);
if(a==b)return;
par[b]=a;
}
}d;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m>>q;
for(int i=1;i<=q;++i){
cin>>que[i].fi>>que[i].se;
le[i]=1,ri[i]=m;
ans[i]=-1;
}
while(1){
bool ok=0;
for(int i=1;i<=q;++i)
if(le[i]<=ri[i]){
int mid=(le[i]+ri[i])>>1;
cand[mid].push_back(i);
ok=1;
}
if(!ok)break;
d=dsu(n+m);
for(int mid=1;mid<=m;++mid){
int x=m-mid+1;
for(int j=x;j<=n;j+=x)
d.join(j,x+n);
for(const int&i:cand[mid]){
bool flag=d.find(que[i].fi)==d.find(que[i].se);
if(flag){
ans[i]=mid;
ri[i]=mid-1;
}else le[i]=mid+1;
}
cand[mid].clear();
}
}
for(int i=1;i<=q;++i)
cout<<ans[i]<<'\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |