树上祖先询问
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个以1为根有n个节点的树。在q次询问中,每次给你两个集合,请你判断是否中是否存在一个节点是集合所有点的祖先?

让我们回忆一下祖先的定义~:一个结点到根结点的路径上,除了它本身外的结点。 
根结点的祖先集合为空。

输入描述:

第一行两个正整数n,q表示树的大小和询问的数量。
第二行n-1个正整数,依次表示2号点到n号点的父亲的编号。

接下来是q次询问,在每次询问中:

首先是两个正整数表示A,B集合的大小。

接下来一行个正整数表示集合中的节点编号。

接下来一行个正整数表示集合中的节点编号。



题目保证集合中给出的节点编号都在1n的范围内,且每次询问中两个集合内部的点不重复。

输出描述:

输出q行每行一个字符串:如果存在则输出一个字符串"yes",如果不存在则输出一个字符串"no"(不输出引号)。
示例1

输入

复制
3 2 
1 1 
2 1 
2 3 
1
3 1 
1 2 3 
1

输出

复制
yes
no

说明

树长这样:

第一次集合A为{2,3},集合B为{1},1是2和3号点的祖先,所以输出yes
第二次集合A为{1,2,3},集合B为{1},1是2和3号点的祖先但是不是1的祖先,所以输出no