一个通信网络由若干计算机和若干链路组成。计算机编号为 $0$ 到 $N-1$。一条链路允许两个不同的计算机进行双向通信。也就是说,该通信网络是一个具有 $N$ 个顶点的无向图,每条链路是一条连接两个不同顶点的边。初始时,通信网络中没有任何链路。
每一秒,会有多条链路被加入或移除。具体来说,对于每个 $u = 0, 1, 2, \dots, T-1$,给定一个由若干条互不相同的链路构成的集合 $E_u$。在时刻 $u + 0.5$,通信网络按照以下规则进行更新:
- 如果 $E_u$ 中的一条链路在当前通信网络中不存在,则将该链路加入通信网络。
- 如果 $E_u$ 中的一条链路在当前通信网络中已存在,则将该链路从通信网络中移除。
对于任意整数 $t$ 和两台计算机 $a$ 与 $b$,如果在时刻 $t$ 的通信网络中,存在一条仅由当前存在的链路构成的路径连接 $a$ 与 $b$,则称计算机 $a$ 和 $b$ 在时刻 $t$ 连通。如果 $a = b$,则无论链路情况如何,总是视为连通。
此外,对于任意整数区间 $[l, r]$ 和两台计算机 $a$ 与 $b$,如果对于所有 $t = l, l+1, \dots, r$,计算机 $a$ 与 $b$ 在时刻 $t$ 均连通,则称计算机 $a$ 与 $b$ 在时间区间 $[l, r]$ 内始终连通。
为了研究在特定时间区间内哪些计算机能够稳定地相互通信,你需要回答以下查询:
给定一台计算机 $x$ 和时间区间 $[l, r]$,求有多少台计算机 $y$ 满足计算机 $x$ 与 $y$ 在时间区间 $[l, r]$ 内始终连通。($0 \le x \le N-1$,$0 \le l \le r \le T$,$0 \le y \le N-1$)
函数说明
你需要实现如下函数:
vector<int> count_computers(int N, int T, int Q, vector<vector<array<int,2>>> E, vector<array<int,3>> F)
- $E$:表示被加入或移除的链路集合。$E$ 的大小为 $T$。每个 $E[i]$ 是一个包含至少 $1$ 条互不相同链路的数组,表示集合 $E_i$。每条链路由一个大小为 $2$ 的数组 $[a, b]$ 表示($a < b$),表示连接计算机 $a$ 和 $b$。
- $F$:表示查询的数组。$F$ 的大小为 $Q$。对于所有 $i$($0 \le i \le Q-1$),$F[i]$ 表示第 $i$ 个查询。每个查询是一个大小为 $3$ 的数组 $[x, l, r]$,其中 $x$ 表示计算机编号,$l, r$ 表示时间区间。
该函数应返回一个大小为 $Q$ 的整数数组 $R$。对于所有 $j$($0 \le j \le Q-1$),$R[j]$ 表示第 $j$ 个查询的答案。
该函数只会被调用一次。
提交的源代码在任何部分都不得执行输入/输出函数。
限制
- $2 \le N \le 100\,000$
- $1 \le T \le 100\,000$
- $1 \le Q \le 250\,000$
- 每个 $E_i$ 中的链路互不相同。
- 设 $S = \sum_{0 \le i \le T-1} |E_i|$,则 $S \le 100\,000$。
- 输入中每条链路均满足 $0 \le a < b \le N-1$。
- 每个查询满足 $0 \le x \le N-1$,$0 \le l \le r \le T$。
子任务
| 编号 | 分值 | 限制条件 |
|---|---|---|
| 1 | 5 | $N, S, Q \le 100$ |
| 2 | 12 | $N, S, Q \le 5\,000$ |
| 3 | 19 | 对所有查询,$l = r$ |
| 4 | 23 | 对每条出现在 $E$ 中的链路 $[a, b]$,满足 $\lvert a - b \rvert = 1$ |
| 5 | 41 | 无额外限制 |
样例数据
考虑如下函数调用:
count_computers(
4, 5, 7,
[
[[0, 1], [1, 2]],
[[2, 3], [1, 3]],
[[0, 1], [0, 3]],
[[0, 1], [1, 2], [0, 3], [2, 3]],
[[1, 3]]
],
[
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[0, 0, 5],
[2, 1, 3],
[1, 1, 4],
[3, 2, 3]
]
)
通信网络中共有 $4$ 台计算机。
各时刻通信网络的链路情况如下:
- 时刻 $0$:无链路。
- 时刻 $1$:链路 $(0,1)$,$(1,2)$。
- 时刻 $2$:链路 $(0,1)$,$(1,2)$,$(2,3)$,$(1,3)$。
- 时刻 $3$:链路 $(1,2)$,$(2,3)$,$(1,3)$,$(0,3)$。
- 时刻 $4$:链路 $(0,1)$,$(1,3)$。
- 时刻 $5$:链路 $(0,1)$。
共有 $7$ 个查询:
- 查询 $0$:在时刻 $1$,计算机 $1$ 与计算机 $\{0,1,2\}$ 连通。
- 查询 $1$:在时刻 $2$,计算机 $2$ 与计算机 $\{0,1,2,3\}$ 连通。
- 查询 $2$:在时刻 $3$,计算机 $3$ 与计算机 $\{0,1,2,3\}$ 连通。
- 查询 $3$:由于时刻 $0$ 没有链路,从时刻 $0$ 到 $5$,计算机 $0$ 仅与自身连通。
- 查询 $4$:从时刻 $1$ 到 $3$,计算机 $2$ 与计算机 $\{0,1,2\}$ 连通。
- 查询 $5$:从时刻 $1$ 到 $4$,计算机 $1$ 与计算机 $\{0,1\}$ 连通。
- 查询 $6$:从时刻 $2$ 到 $3$,计算机 $3$ 与计算机 $\{0,1,2,3\}$ 连通。
因此函数应返回:
[3, 4, 4, 1, 3, 2, 4]
实现细节
样例评测程序的输入格式如下。
第一行:$N$ $T$ $Q$
对于所有 $0 \le i \le T-1$:
- 一行:$|E_i|$
- 接下来 $|E_i|$ 行:每行两个整数 $a$ $b$,表示 $E_i$ 中的一条链路。
对于所有 $0 \le i \le Q-1$:
- 一行:$x$ $l$ $r$
样例评测程序的输出格式如下:
- 共 $Q$ 行,第 $i$ 行输出 $R[i]$。 ```