如题,二分上界应该是对的/yun
#include<bits/stdc++.h>
#define pii pair<int,int>
#define pi pair<pii,pii>
#define x first
#define y second
#define pb push_back
using namespace std;
const int N = 1e6 + 7;
int n,m,q;
pii a[N];
pii stk[N]; int tp;
int fa[N],siz[N];
int find(int x){
if(x==fa[x]) return x;
return find(fa[x]);
}
void Merge(int x,int y){
x = find(x), y = find(y);
if(x==y) return;
if(siz[x]<siz[y]) swap(x,y);
fa[y] = x;
siz[x] += siz[y];
stk[++tp] = {x,y};
}
void Pop(){
int x = stk[tp].x, y = stk[tp].y;
fa[y] = y;
siz[x] -= siz[y];
tp--;
}
int p;
int ans[N];
void solve(int l,int r,vector<pi>vec){
if(!vec.size()) return;
if(l==r){
for(auto c:vec) ans[c.y.y] = l;
return;
}
int mid = (l+r)/2;
vector<pi>vl,vr;
while(p<mid) p++,Merge(a[p].x,a[p].y);
while(p>mid) Pop(),p--;
for(auto c:vec){
if((find(c.x.x)==find(c.x.y) && siz[find(c.x.x)]>=c.y.x) || (find(c.x.x)!=find(c.x.y) && siz[find(c.x.x)]+siz[find(c.x.y)]>=c.y.x)) vl.push_back(c);
else vr.push_back(c);
}
solve(l,mid,vl);
solve(mid+1,r,vr);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;++i) siz[i] = 1,fa[i] = i;
for(int i=1;i<=m;++i) cin>>a[i].x>>a[i].y;
cin>>q;
vector<pi>vec(q);
for(int i=0;i<q;++i){
cin>>vec[i].x.x>>vec[i].x.y>>vec[i].y.x;
vec[i].y.y = i + 1;
}
solve(1,m,vec);
for(int i=1;i<=q;++i) cout<<ans[i]<<'\n';
return 0;
}