#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 5;
int fa[maxn], n, m, u, v, a[maxn][3], ans[maxn], x[maxn], y[maxn], f[maxn][3];
list<int> s[maxn];
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
int rx = find(x), ry = find(y);
if (rx < ry) swap(rx, ry);
if (rx != ry) {
fa[rx] = ry;
s[ry].splice(s[ry].end(), s[rx]);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i][1] >> a[i][2];
ans[i] = -1;
fa[i] = i;
s[i].push_back(i);
}
for (int i = 1; i <= m; i++) {
cin >> x[i] >> y[i];
f[x[i]][y[i]] = 1;
}
for (int i = 1; i <= n; ++i) {
if (!f[i][1] && a[i][1] != -1) merge(i, a[i][1]);
if (!f[i][2] && a[i][2] != -1) merge(i, a[i][2]);
}
for (int i = m; i >= 1; i--) {
if (a[x[i]][y[i]] == -1) continue;
int p = find(x[i]), q = find(a[x[i]][y[i]]);
if (p != q) {
if (p == 1 || q == 1)
for (auto j : s[max(p, q)])
ans[j] = i - 1;
merge(p, q);
}
}
for (int i = 1; i <= n; i++)
cout << ans[i] << endl;
return 0;
}
上面的代码82pts,RE两个点,但是把maxn从2e5改成4e5就AC了,到底是哪个地方RE了,怎么也找不到...