private int BinSearch(int a, int b, int need, int M, PersistentPartialUnionFind uf) { int L = -1, R = M; while (R - L > 1) { int mid = L + R >> 1; int x = uf.Root(a, mid); int y = uf.Root(b, mid); int num = uf.NumElements(x, mid); if (num < need && x != y) { num += uf.NumElements(y, mid); } if (num >= need) { R = mid; } else { L = mid; } } return(R); }
private int BinSearch(int a, int b, int need, int M, PersistentPartialUnionFind uf) { int L = -1, R = M; while (R - L > 1) { int mid = L + R >> 1; int num = uf.NumElements(a, mid) + (uf.Same(a, b, mid) ? 0 : uf.NumElements(b, mid)); if (num >= need) { R = mid; } else { L = mid; } } return(R); }
public void Solve() { int N = Reader.Int(), M = Reader.Int(); var E = Reader.IntTable(M); int NQ = Reader.Int(); var Q = Reader.IntTable(NQ); var uf = new PersistentPartialUnionFind(N); Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); foreach (var e in E) { uf.Unite(--e[0], --e[1]); } foreach (var q in Q) { Console.WriteLine(BinSearch(--q[0], --q[1], q[2], M, uf)); } Console.Out.Flush(); }