这代码没有问题吧?
#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> g[200005];
void add(int x, int y, int z)
{
g[x].push_back(y);
g[x].push_back(z);
}
int t, s[200005], f[200005][20], v[200005], n, m;
void dfs(int x, int y)
{
f[x][0] = y;
for (int i = 1; i < 20; i ++)
{
f[x][i] = f[f[x][i - 1]][i - 1];
}
if (g[x].size() == 0)
{
s[x] = 1;
return;
}
s[x] = 0;
for (int i = 0; i < g[x].size(); i ++)
{
int z = g[x][i];
if(z == y) continue;
dfs(z, x);
s[x] += s[z];
}
}
int check(int x, int y, int z)
{
for (int i = 19; i >= 0; i --)
{
if (v[f[y][i]] <= x) y = f[y][i];
if (v[f[z][i]] <= x) z = f[z][i];
}
if(x == y) return s[y];
return s[y] + s[z];
}
int ar[200005];
int find(int x)
{
return ar[x] == x ? x : ar[x] = find(ar[x]);
}
signed main()
{
int x, y, z;
cin >> n >> m;
t = n;
for (int i = 1; i <= 2 * n; i ++)
{
v[i] = 0;
ar[i] = i;
}
v[0] = 1073741824;
for (int i = 1; i <= m; i ++)
{
cin >> x >> y;
int find_x = find(x), find_y = find(y);
if (t < n * 2 - 1 && find_x != find_y)
{
t ++;
v[t] = i;
ar[find_y] = t;
ar[find_x] = t;
add(t, find_x, find_y);
}
}
dfs(t, 0);
int q;
cin >> q;
for (int i = 0; i < q; i ++)
{
cin >> x >> y >> z;
int ans = m, l = 0, r = m;
while (l <= r)
{
int mid = l + r >> 1;
if (check(mid, x, y) < z) l = mid + 1, ans = l;
else r = mid - 1;
}
cout << ans << "\n";
}
return 0;
}
过不了样例。