以时间为下标建线段树。线段树每个节点开个vector。
对每条边在其出现时间内加入线段树,即,把这条边按时间放在线段树的对应区间上,会影响
\(O(\log n)\)个节点。
询问就放在线段树的对应叶子节点上。
然后对整棵树DFS,当进入一个节点时,将这个点代表的这段区间中出现的边全部加到图里,即合并起来,之后在离开这个点时撤销。
可以用不路径压缩、按秩合并的并查集维护连通性。这样就可以撤销了。
合并时用栈记录合并前状态,合并前的父节点用
\(x\)或是
\(fa[x]\)都行,因为合并的时候是合并集合根节点,用
\(x\)还是
\(fa[x]\)都一样。。
如果秩改变也要加入栈。
启发式合并按深度还是按size无所谓。
//1548ms 48256K#include