传送门

倍增水题……

本来还想用LCT做的……然后发现根本不需要

 //minamoto
#include<bits/stdc++.h>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
inline bool isop(char ch){
return ch=='I'||ch=='H'||ch=='O';
}
inline char readop(){
char ch;
while(!isop(ch=getc()));
return ch;
}
const int N=;
int head[N],Next[N<<],edge[N<<],ver[N<<],fa[N][],d[N],dist[N];
int n,m,tot;
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=e;
}
void dfs(int u,int f){
d[u]=d[f]+,fa[u][]=f;
for(int i=;(<<i)<=d[u];++i) fa[u][i]=fa[fa[u][i-]][i-];
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v==f) continue;
dist[v]=dist[u]+edge[i],dfs(v,u);
}
}
int LCA(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=;i>=;--i)
if(d[fa[x][i]]>=d[y]) x=fa[x][i];
if(x==y) return x;
for(int i=;i>=;--i)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][];
}
int querylen(int x,int y,int k){
int lca=LCA(x,y);
if(d[x]-d[lca]+>=k){
int ans=d[x]-k+;
for(int i=;i>=;--i)
if((<<i)<=d[x]-ans) x=fa[x][i];
return x;
}
else{
int ans=d[lca]*+k-d[x]-;
for(int i=;i>=;--i){
if(d[y]-(<<i)>=ans) y=fa[y][i];
}
return y;
}
}
int main(){
//freopen("testdata.in","r",stdin);
int q=read();
while(q--){
memset(head,,sizeof(head));
memset(fa,,sizeof(fa));
d[]=dist[]=,tot=;
int n=read();
for(int i=;i<n;++i){
int u=read(),v=read(),e=read();
add(u,v,e);
}
dfs(,);
bool flag=true;
while(flag){
char op=readop();
switch(op){
case 'O':flag=false;break;
case 'I':{
int u=read(),v=read();
int lca=LCA(u,v);
printf("%d\n",dist[u]+dist[v]-*dist[lca]);
break;
}
case 'H':{
int u=read(),v=read(),k=read();
printf("%d\n",querylen(u,v,k));
break;
}
}
}
puts("");
}
return ;
}

最新文章

  1. -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HO 解决办法
  2. python 调用系统命令
  3. java io读书笔记(7) Closing Output Streams
  4. 总结css兼容问题
  5. Android游戏背景音乐音效音量控制
  6. 获取不到app.config里面的数据库连接字符串的解决方法
  7. 匿名函数和Lambda表达式
  8. composite template 组合模式
  9. (转)CSS颜色及&lt;a&gt;标签超链接颜色改变
  10. Entity Framework Core 软删除与查询过滤器
  11. python_如何定义装饰器类?
  12. 基于Jenkins+Git+Gradle的Android持续集成
  13. python控制台输出带颜色的文字方法
  14. __name__的意义与作用
  15. Google推出了Python最牛逼的编辑器
  16. 啊哈算法第四章第二节解救小哈Java实现
  17. Harry Potter and J.K.Rowling(半平面交+圆和矩形交)
  18. ruby安装及升级
  19. 代码版本控制[version control]之Git
  20. uva11383 转化为 二分图匹配

热门文章

  1. 【HDU4734】F(x) 【数位dp】
  2. Maven详解【面试+工作】 各种安装 没用
  3. 第二话:javascript中闭包的理解
  4. CentOS搭建VSFTP服务器
  5. javascript中的replace()方法
  6. code1047 邮票面值设计
  7. array_column()
  8. g2o 图优化
  9. gitlab centos 安装配置运维笔记
  10. transition与animation的区别