Example #1
0
        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);
        }