[IOI2009] Regions
题目背景
## 滥用本题评测将被封号
IOI2009 D2T3
原题时间限制 8s,为节约评测资源,时间限制改为 4s。
题目描述
联合国区域发展委员会(The United Nations Regional Development Agency, UNRDA)有一个良好的组织结构。它任用了 $N$ 名委员,每名委员都属于几个地区中的一个。委员们按照其资历被编号为 $1$ 到 $N$ ,$1$ 号委员是主席,资历最高。委员所属地区被编号为 $1$ 到 $R$。除了主席之外所有委员都有一个直接导师。任何直接导师的资历都比他所指导的委员的资历要高。
我们称委员 $A$ 是委员 $B$ 的导师当且仅当 $A$ 是 $B$ 的直接导师或者 $A$ 是 $B$ 的直接导师的导师。显然,主席是所有其他委员的导师,没有任何两名委员互为导师。
现在,为了调查大量对 UNRDA 偏向某些地区的不平衡的组织结构的指控,UNRDA 想要建立一个计算机系统:在给定委员之间的直接导师关系的情况下,该系统可以回答下述形式的问题:给定两个地区 $r_1$ 和 $r_2$,要求系统回答委员会中有多少对委员 $e_1$ 和 $e_2$,满足 $e_1$ 属于 $r_1$,而 $e_2$ 属于 $r_2$,并且 $e_1$ 是 $e_2$ 的导师。每次询问都有两个参数 $r_1$ 和 $r_2$,结果是一个整数:满足上述条件的 $(e_1, e_2)$ 二元组的数量。
**任务**:编写一个程序,给定每个委员的地区和直接导师,**在线** 回答上述询问。
**强制在线将以交互的格式进行**。
输入输出格式
输入格式
第一行包含三个整数 $N, R, Q$,分别由一个空格隔开,分别表示雇员人数,区域数和查询数。
接下来 $N$ 行按照资历的顺序给出了 $N$ 个委员的描述信息。其中第 $k$ 行描述了编号为 $k$ 的委员。第一行(描述主席的一行)包含一个整数:主席所属的地区 $H_1$。其余的 $N - 1$ 行,每行包含两个整数,以一个空格隔开分别表示委员 $k$ 的直接导师 $S_k$ 和委员 $k$ 所属的地区 $H_k$。
### 交互格式
在读入所有输入数据之后,你的程序必须依次从标准输入中读入询问,并将询问结果输出至标准输出。必须依次回答 $Q$ 个询问,每次回答一个。**在读入下一个询问之前,你必须先回答当前询问**。
每个询问是标准输入的一行,用两个不同整数 $r_1, r_2$ 表示。
输出格式
对查询的回答是标准输出的一行,包含一个整数,表示在 UNRDA 中有多少对委员 $e_1$ 和 $e_2$ 满足下述条件:$e_1$ 属于地区 $r_1$,$e_2$ 属于地区 $r_2$,并且 $e_1$ 是 $e_2$ 的导师。
**注意**:输入数据保证给出的任意询问的正确答案小于 $10 ^ 9$。
**特别注意**:为了正确地和交互库交互,你的程序必须 **在回答每次询问后刷新标准输出缓冲区**。你同样需要避免意外地在读入标准输入时堵住了输入流,这有可能在你使用 `scanf("%d\n", ...)` 的语句时发生。
你可以使用如下语句来清空缓冲区:
- 对于 C/C++:`fflush(stdout)`;
- 对于 C++:`std::cout << std::flush`;
- 对于 Java:`System.out.flush()`;
- 对于 Python:`stdout.flush()`;
- 对于 Pascal:`flush(output)`;
- 对于其他语言,请自行查阅对应语言的帮助文档。
特别的,对于 C++ 语言,在输出换行时如果你使用 `std::endl` 而不是 `'\n'`,也可以自动刷新缓冲区。
输入输出样例
输入样例 #1
6 3 4
1
1 2
1 3
2 3
2 3
5 1
1 2
1 3
2 3
3 1
输出样例 #1
1 [刷新缓冲区]
3 [刷新缓冲区]
2 [刷新缓冲区]
1 [刷新缓冲区]
说明
### 数据范围与约定
- 对于 $30\%$ 的数据,$N\leq 500$。
- 对于 $55\%$ 的数据,没有地区包含超过 $500$ 个委员。
- 同时满足上述两个条件的数据有 $15\%$,至少满足上述一个条件的数据有 $70\%$。
- 对于 $100\%$ 的数据,$1 \le N, Q \le 2 \times 10^5$,$1 \le H_k, r_1, r_2 \le R \le 2.5 \times 10^4$,$1 \le S_k < k$。