1#include"../../kyopro_library/template.hpp"
2#include"../../kyopro_library/graph/dsu_rollback.hpp"
11 edges=vector<vector<P>>(2*n);
16 void unite(
int time,
int u,
int v) {
18 if(count[e]++==0) appear[e]=time;
22 void cut(
int time,
int u,
int v) {
24 if(--count[e]==0) period.push_back({{appear[e],time},e});
29 for(
auto [e,val]: count)
if(val>0) period.push_back({{appear[e],n},e});
30 for(
auto [range,e]: period) {
34 if(l&1) edges[l++].push_back(e);
35 if(r&1) edges[--r].push_back(e);
44 for(
auto [u,v]: edges[k]) dsu.merge(u,v);
48 }
else if(0<=k-n && k-n<n) {
52 for(
auto [u,v]: edges[k]) dsu.undo();
56 using P=
pair<
int,
int>;
59 vector<vector<P>> edges;
60 vector<pair<P,P>> period;
61 map<P,
int> count,appear;
オフラインのDinamic Connectiviy
void execute(auto &f, int k=1)
クエリ関数 f を処理する
void unite(int time, int u, int v)
時間 time に頂点 u, v を連結する
DynamicConnectivity(int v, int q)
コンストラクタ
void cut(int time, int u, int v)
時間 time に頂点 u, v を切断する