【题目链接】

点击打开链接

【算法】

树上倍增,时间复杂度 : O(qklog(n))

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 3000010
#define MAXLOG 18
const int INF = 1e8; int T,tot = ,i,x;
char opt[];
int q[MAXN],dep[MAXN],anc[MAXN][MAXLOG]; inline void update(int x)
{
int i;
tot++;
dep[tot] = dep[x] + ;
anc[tot][] = x;
for (i = ; i < MAXLOG; i++) anc[tot][i] = anc[anc[tot][i-]][i-];
}
inline int query(int k)
{
int i,j,t,mn = INF;
bool flag = true;
for (i = ; i <= k; i++) mn = min(mn,dep[q[i]]);
for (i = ; i <= k; i++)
{
t = dep[q[i]] - mn;
for (j = ; j < MAXLOG; j++)
{
if (t & ( << j))
q[i] = anc[q[i]][j];
}
}
for (i = ; i <= k; i++) flag &= (q[i] == q[]);
if (flag) return q[];
for (i = MAXLOG - ; i >= ; i--)
{
flag = true;
for (j = ; j <= k; j++) flag &= (anc[q[j]][i] == anc[q[]][i]);
if (!flag)
{
for (j = ; j <= k; j++) q[j] = anc[q[j]][i];
}
}
return anc[q[]][];
} int main()
{ scanf("%d",&T);
while (T--)
{
scanf("%s%d",&opt,&x);
if (opt[] == 'A') update(x);
else
{
for (i = ; i <= x; i++) scanf("%d",&q[i]);
printf("%d\n",query(x));
}
}
return ;
}

最新文章

  1. .html(),.text()和.val()的差异总结
  2. venus java高并发框架
  3. 基于RESTful标准的Web Api
  4. 告别node-forever,拥抱PM2
  5. ASP.NET MVC模型部分验证
  6. TCP服务端和客户端的框架
  7. chrome输入框记住密码导致背景黄色的解决方案
  8. javaScript绑定事件委托 demo
  9. Mac 下如何使用sed -i命令
  10. bind、apply与call
  11. Mybatis实体类属性与数据库字段不一致解决办法
  12. Hibernate的增删改查(事务)
  13. 【转】CSS中的浮动和清除浮动
  14. [Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址
  15. Centos7修改系统时区
  16. No module named &#39;pandas._libs.tslib&#39;
  17. 剑指 offer 面试题31 连续子数组的最大和(动态规划)
  18. Spring-AOP SpringBoot自动配置和启动Spring AOP
  19. BZOJ1492 货币兑换 CDQ分治优化DP
  20. 【ARM】2410裸机系列-uart串口通信

热门文章

  1. Buffer.compare()
  2. java读utf8 的txt文件,第一个字符为空或问号问题
  3. JDK的安装和环境变量配置
  4. 自动生成 serialVersionUID 的设置
  5. 1004. 成绩排名 (20) (快速排序qsort函数的使用问题)
  6. 2018 &amp; 微信小程序
  7. noip模拟赛 旅行
  8. intent使用Serializable传递对象
  9. Aizu - 0558 Cheese (bfs)
  10. 远程调试 Android 设备使用入门(谷歌翻译版)