void Solve() { io.i(out N, out M); aby = new Tuple <int, int, int> [M]; M.REP(i => { int a = io.Int; int b = io.Int; int y = io.Int; aby[i] = Tuple.Create(a, b, y); }); Q = io.Int; vw = new Tuple <int, int> [Q]; Q.REP(i => { int v = io.Int; int w = io.Int; vw[i] = Tuple.Create(v, w); }); aby = aby.OrderByDescending(t => t.Item3).ToArray(); var vwi = vw.Select((t, i) => new { t, i }). OrderByDescending(a => a.t.Item2).ToArray(); var ans = new int[Q]; var uf = new UnionFind(); uf.Init(N); var vwindex = 0; for (int i = 0; i < M && vwindex < Q; ++i) { var curYear = aby[i].Item3; while (vwindex < Q && curYear <= vwi[vwindex].t.Item2) { ans[vwi[vwindex].i] = uf.Size(vwi[vwindex].t.Item1); vwindex++; } uf.Unite(aby[i].Item1, aby[i].Item2); } while (vwindex < Q) { ans[vwi[vwindex].i] = uf.Size(vwi[vwindex].t.Item1); vwindex++; } io.o(ans); }