不想写看zory大佬

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int dep[];
int f[][],Bin[];
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=Bin[i])x=f[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
if(dep[x]>=Bin[i]&&f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][];
}
int getdis(int x,int y)
{
return dep[x]+dep[y]-*dep[LCA(x,y)];
}
int d1[],d2[];
int rt[]; char ss[];
int main()
{
Bin[]=;for(int i=;i<=;i++)Bin[i]=Bin[i-]*; int Q,cnt=,x;
scanf("%d",&Q);
while(Q--)
{
scanf("%s%d",ss+,&x);
if(ss[]=='B')
{
cnt++;
if(x==-)
{
rt[cnt]=cnt;
d1[cnt]=d2[cnt]=cnt;
dep[cnt]=;
}
else
{
rt[cnt]=rt[x];
dep[cnt]=dep[x]+;
f[cnt][]=x;for(int i=;Bin[i]<=dep[cnt];i++)f[cnt][i]=f[f[cnt][i-]][i-];
int dis=getdis(d1[rt[cnt]],d2[rt[cnt]]);
if(getdis(d1[rt[cnt]],cnt)>dis)d2[rt[cnt]]=cnt;
if(getdis(d2[rt[cnt]],cnt)>dis)d1[rt[cnt]]=cnt;
}
}
else printf("%d\n",max( getdis(x,d1[rt[x]]),getdis(x,d2[rt[x]]) ));
}
return ;
}

最新文章

  1. ActiveMQ 即时通讯服务 浅析
  2. SQL TOP 子句、SQL LIKE 操作符、SQL 通配符
  3. Getaddrinfo()笔记
  4. caffe的db_lmdb.hpp文件
  5. Centos7 + Windows7 双系统
  6. html2canvas 踩坑总结
  7. office文件在线预览,模仿网易邮箱在线预览的
  8. js将数字转换成大写的人民币表达式
  9. win10锁屏壁纸路径
  10. Levenshtein Distance + LCS 算法计算两个字符串的相似度
  11. C#中USB转串口的拔插捕获
  12. 抓包工具Charles基本用法
  13. node离线版安装
  14. 从excel表中生成批量SQL,将数据录入到数据库中
  15. Java进程线程理解
  16. 问题-DelphiXE10.1 FireDAC联接oracle数据库方法
  17. linux:用户及文件权限管理
  18. Zabbix二次开发_02获取数据
  19. 利用Volatility对Linux内存取证分析-常用命令翻译
  20. Codeforces766B Mahmoud and a Triangle 2017-02-21 13:47 113人阅读 评论(0) 收藏

热门文章

  1. ubuntu上Hadoop三种运行模式的部署
  2. fcc 响应式框架Bootstrap 练习2
  3. 删除过期备份报错RMAN-06207 RMAN-06208解决方案
  4. IE9的F12工具,&quot;网络&quot;页签,点击&quot;开始捕获&quot;之后,请求显示的状态是&quot;挂起&quot;的分析和解决
  5. ASP.NET 缓存(Cache)
  6. [Windows Server 2012] Filezilla安全加固方法
  7. MFC CAD控制权问题
  8. Git环境部署
  9. NLTK学习笔记(七):文本信息提取
  10. ganlgia-rrdcached