time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

After the piece of a devilish mirror hit the Kay’s eye, he is no longer interested in the beauty of the roses. Now he likes to watch snowflakes.

Once upon a time, he found a huge snowflake that has a form of the tree (connected acyclic graph) consisting of n nodes. The root of tree has index 1. Kay is very interested in the structure of this tree.

After doing some research he formed q queries he is interested in. The i-th query asks to find a centroid of the subtree of the node vi. Your goal is to answer all queries.

Subtree of a node is a part of tree consisting of this node and all it’s descendants (direct or not). In other words, subtree of node v is formed by nodes u, such that node v is present on the path from u to root.

Centroid of a tree (or a subtree) is a node, such that if we erase it from the tree, the maximum size of the connected component will be at least two times smaller than the size of the initial tree (or a subtree).

Input

The first line of the input contains two integers n and q (2 ≤ n ≤ 300 000, 1 ≤ q ≤ 300 000) — the size of the initial tree and the number of queries respectively.

The second line contains n - 1 integer p2, p3, …, pn (1 ≤ pi ≤ n) — the indices of the parents of the nodes from 2 to n. Node 1 is a root of the tree. It’s guaranteed that pi define a correct tree.

Each of the following q lines contain a single integer vi (1 ≤ vi ≤ n) — the index of the node, that define the subtree, for which we want to find a centroid.

Output

For each query print the index of a centroid of the corresponding subtree. If there are many suitable nodes, print any of them. It’s guaranteed, that each subtree has at least one centroid.

Example

Input

7 4

1 1 3 3 5 3

1

2

3

5

Output

3

2

3

6

Note



The first query asks for a centroid of the whole tree — this is node 3. If we delete node 3 the tree will split in four components, two of size 1 and two of size 2.

The subtree of the second node consists of this node only, so the answer is 2.

Node 3 is centroid of its own subtree.

The centroids of the subtree of the node 5 are nodes 5 and 6 — both answers are considered correct.

【题解】



这个点就是一棵树的“重心”;

考虑每个节点x。找到它的儿子节点里面以该儿子节点为根的子树的大小最大的点记big;

如果size[big]>(size[x]/2);

则这个子树的重心在big节点下面。

否则这个子树的重心就为x;

->有个性质;

两棵树;

如果通过一条边连成了一棵树;那么新的树的重心一定在原来的两棵树的重心的在新的树的路径上。

则我们找到以big为根的节点的子树的重心,然后不断往上走。找到以x为根节点的树的新的重心。(判断依据看代码);

#include <cstdio>
#include <vector> using namespace std; const int MAXN = 4e5; int cnt[MAXN], ans[MAXN],fa[MAXN];
int n, q;
vector <int> a[MAXN]; void dfs(int x)
{
cnt[x] = 1;
ans[x] = x;
int len = a[x].size();
int big = 0;
for (int i = 0; i <= len - 1; i++)
{
int y = a[x][i];
dfs(y);
cnt[x] += cnt[y];
if (cnt[y] > cnt[big])
big = y;
}
if (cnt[big] > cnt[x] / 2)
{
int now = ans[big];
int temp = cnt[x] - cnt[now];
while (temp > (cnt[x] / 2))
{
now = fa[now];
temp = cnt[x] - cnt[now];
}
ans[x] = now;
}
} int main()
{
//freopen("D:\\rush.txt", "r", stdin);
scanf("%d%d", &n, &q);
for (int i = 2; i <= n; i++)
{
int pa;
scanf("%d", &pa);
fa[i] = pa;
a[pa].push_back(i);
}
dfs(1);
for (int i = 1; i <= q; i++)
{
int x;
scanf("%d", &x);
printf("%d\n", ans[x]);
}
return 0;
}

【24.63%】【codefroces 686D】Kay and Snowflake的更多相关文章

  1. codeforces 686D D. Kay and Snowflake(dfs)

    题目链接: D. Kay and Snowflake time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  2. 【题解】【网络流24题】航空路线问题 [P2770] [Loj6122]

    [题解][网络流24题]航空路线问题 [P2770] [Loj6122] 传送门:航空路线问题 \([P2770]\) \([Loj6122]\) [题目描述] 给出一张有向图,每个点(除了起点 \( ...

  3. 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]

    [题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...

  4. 【资料下载区】【iCore4相关代码、资料下载地址】更新日期2018/02/24

    [iCore4相关文档][更新中...] iCore4原理图(PDF)下载iCore4引脚注释(PDF)下载iCore4机械尺寸(PDF)下载 [iCore4相关例程代码][ARM] DEMO测试程序 ...

  5. 【Android】【录音】Android录音--AudioRecord、MediaRecorder

    [Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...

  6. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  7. 【CODECHEF】【phollard rho + miller_rabin】The First Cube

    All submissions for this problem are available. Read problems statements in Mandarin Chinese and Rus ...

  8. 【剑指Offer学习】【所有面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代 ...

  9. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

随机推荐

  1. Android RxJava基本流程和lift源码分析

    基本结构 我们先来看一段最基本的代码,分析这段代码在RxJava中是如何实现的. Observable.OnSubscribe<String> onSubscriber1 = new Ob ...

  2. stm32单片机的封装

    接着去查看VREF...

  3. python3 随机生成10以内的加法算术题

    今晚晚饭过后,看到小孩在做加法题,全是10以内的,因为她现在只会10以内的加法题.而这些题是老婆手动出的题目. 看到这个情景,突然想到,可以用python来实现随机出题,而且可以指定出多少题,出多少以 ...

  4. DE1-SOC调试linux应用程序

    参考http://www.alterawiki.com/wiki/SoCEDSGettingStarted#Getting_Started_with_Linux_Application_Debuggi ...

  5. GO语言学习(四)GO语言语言结构

    Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello ...

  6. 这一篇sigmoid和softmax的比较,讲的不错

    文章: http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数):  引用wiki百科的定义: A lo ...

  7. @RequestMapping value 能够反复吗 [

    @RequestMapping value 能够反复吗 [问题点数:40分,结帖人wangqiao4j] 不显示删除回复显示全部回复 显示星级回复显示得分回复 仅仅显示楼主 u=http://bbs. ...

  8. c++11 多线程 -- 基本使用

    c++11 多线程 – 基本使用 前言:这篇文章仅针对没有使用过c++11线程库的童鞋来高速入门,也是自己的一个简单记录,内容比較基础. 1.线程的基本使用 2.相互排斥量 3.条件变量 4.原子变量 ...

  9. eclipse config 2 tab -&gt; space

    编码规范要求不同意使用tab,可是又要有4个字符的缩进,连点4次space,这不是程序猿的风格 来看看 eclipse 设置一次tab像space的转换 例如以下操作 Window->Prefe ...

  10. 34、JZ2440上WIFI网卡使用

    :http://wireless.kernel.org在这个网站上的document中有下面说有内容的介绍 1. 准备工作(虚拟机,开发板)及配置内核选择WIFI驱动1.1 选型:确定网卡的VID,P ...