https://vjudge.net/contest/148523#problem/F
题意:
给n个点m条边 m条边,每条边都会在某一个时间点断开,然后其他所有时间都是存在的,问每个时间都有多少对点可达
tip:
按时间分治,像线段树一样,往左递归时把右边时间的边加进来,然后把这个操作之前的值和是否改变放到stack里面,然后出栈,把数据还原。
可撤销并查集就是还原本次加边的操作,去掉这个边,相当于还原这次操作root变化的点root回去
#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 2e5+10;
int n,mm,k,head[maxn],tot,treenode,rrank[maxn],root[maxn];
long long ANS,ssize[maxn];
typedef pair <int,int>pii;
struct no{
pii range;
}tree[maxn*4];
struct node{
pii vedge;
int ut,next;
}edges[maxn];
struct bcj{
pii vedge;
int fau,siu,siv,rau,rav;
int fav;
long