但对拍了4000组没拍出来,求调kruskal重构树
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define l(x) x<<1
#define r(x) x<<1|1
#define mpr make_pair
//mt19937_64 ra(time(0) ^ (*new char));
const int SIZE = 1000005;
const int mod = 998244353;
int n, m;
int head[SIZE], ver[SIZE*2], nxt[SIZE*2], tot;
int fa[SIZE], totv, siz[SIZE];
int d[SIZE], f[SIZE][30];
int a[SIZE];
inline int rd(){
int f = 1, x = 0;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return f*x;
}
int power(int x, int y){
int jl = 1;
while(y){
if(y&1) jl = (jl * x) % mod;
x = (x * x) % mod;
y >>= 1;
}
return jl;
}
void add(int x, int y){
// cout << x << " " << y << endl;
ver[++tot] = y, nxt[tot] = head[x];
head[x] = tot;
}
struct E{
int x, y, val;
}e[SIZE];
bool cmp(E x, E y){
return x.val < y.val;
}
int get(int x){
if(x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
void dfs(int x, int ffa){
d[x] = d[ffa] + 1, f[x][0] = ffa;
for(int i = 1; i <= 24; i++) f[x][i] = f[f[x][i-1]][i-1];
bool ff = 0;
for(int i = head[x]; i; i = nxt[i]){
int y = ver[i];
if(y == ffa) continue;
dfs(y, x);
ff = 1;
siz[x] += siz[y];
}
if(!ff) siz[x] = 1;
}
bool check(int x, int y, int mid, int kk){
int nowx = x;
for(int i = 24; i >= 0; i--)
if(a[f[nowx][i]] <= mid){
nowx = f[nowx][i];
}
int nowy = y;
for(int i = 24; i >= 0; i--)
if(a[f[nowy][i]] <= mid){
nowy = f[nowy][i];
}
// if(a[nowy] > a[nowx]) swap(nowx, nowy);
// cout << mid << " " << nowx << " " << siz[nowx] << endl;
if(nowx == nowy) return siz[nowx] >= kk;
else return siz[nowx] + siz[nowy] >= kk;
}
int main(){
// freopen("In.in", "r", stdin);
// freopen("My.out", "w", stdout);
n = rd(), m = rd();
for(int i = 1; i <= m; i++){
e[i].x = rd(), e[i].y = rd(), e[i].val = i;
}
sort(e+1, e+m+1, cmp);
for(int i = 1; i <= 2*n; i++) fa[i] = i;
totv = n;
memset(a, 0x3f, sizeof(a));
for(int i = 1; i <= n; i++){
int x = e[i].x, y = e[i].y, val = e[i].val;
int xx = get(x), yy = get(y);
if(xx == yy) continue;
totv++;
fa[xx] = totv;
fa[yy] = totv;
a[totv] = val;
// cout << totv << " " << a[totv] << endl;
add(xx, totv); add(totv, xx);
add(yy, totv); add(totv, yy);
}
dfs(totv, 0);
int T = rd();
while(T--){
int x = rd(), y = rd(), kk = rd();
int l = 1, r = m, ans = m;
while(l <= r){
int mid = (l + r) >> 1;
if(check(x, y, mid, kk)) r = mid - 1, ans = mid;
else l = mid + 1;
}
printf("%d\n", ans);
}
return 0;
}