【2017集训选拔赛】森林

时间限制: 2000 ms 内存限制: 128000 kb
总通过人数: 0 总提交人数: 1

题目描述

给你一堆树,有以下两种操作:

1、求两个点的最近公共祖先,如果两个点不在同一棵树,则输出 $-1$;

2、将一棵树的根变为另一棵树的一个点的儿子。

输入

第一行包含一个正整数 $T$ ,表示有 $T$ 组测试数据。

接下来依次给出每组测试数据。对于每组测试数据:

第一行,包含三个整数 $n, m,q$ ,表示一共有 $n$ 个点,$m$ 条边,$q$ 组询问($1\le n,q \le 100000,0 \le m < n$)。

接下来 $m$ 行,每行 2 个整数 $x, y$ 代表 $x$ 是 $y$ 的父节点。

接下来 $q$ 行,每行 3 个整数 $w, x, y$:

当 $w = 1$ 时,询问 $x, y$ 的最近公共祖先,如果两个点不在同一棵树,则输出 $-1$。

当 $w = 2$ 时,将 $x$ 节点设为 $y$ 节点的父亲,保证 $y$ 节点此时为一棵树的根。

输出

对于每组数据的每组 $w = 1$ 的询问,输出一行,为题目中要求的答案。

输入样例

1
7 4 4
2 4
2 5
3 6
3 7
1 4 7
2 1 2
2 1 3
1 4 7

输出样例

-1
1

相关推荐