提交时间:2022-07-13 11:55:07

运行 ID: 51596

#include<cstdio> #define rep(a,b,c) for(int c(a);c<=(b);++c) #define grep(b,c) for(int c(head[b]);c;c=nxt[c]) inline int read() { int res=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();return res; } template<typename T> inline T max(const T&x,const T&y){return x<y?y:x;} const int N=1e5+10;struct Seg{int l,r,sz;}t[N<<5];int Rt[N],cnt; int n,top[N],siz[N],mxs[N],dep[N],fa[N],head[N],des[N<<1],nxt[N<<1],val[N<<1],cgt,w[N]; inline void ins(int z,int x,int y) { nxt[++cgt]=head[x];des[head[x]=cgt]=y;val[cgt]=z; nxt[++cgt]=head[y];des[head[y]=cgt]=x;val[cgt]=z; } namespace TreeCut { inline void dfs0(int u=1,int f=0) { dep[u]=dep[fa[u]=f]+1;siz[u]=1;int mx=0; grep(u,i) { int v=des[i];if(v==f)continue; w[v]=val[i];dfs0(v,u);siz[u]+=siz[v]; mx<siz[v]?mx=siz[mxs[u]=v]:0; } } inline void dfs1(int u=1,int fa=0,int tp=1) { top[u]=tp;if(mxs[u])dfs1(mxs[u],u,tp); grep(u,i){int v=des[i];if(v==fa||v==mxs[u])continue;dfs1(v,u,v);} } inline int LCA(int u,int v) { while(top[u]!=top[v]) { dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]]; } return dep[u]<dep[v]?u:v; } } using namespace TreeCut; namespace HJTree { inline void update(int x){t[x].sz=t[t[x].l].sz+t[t[x].r].sz;} inline void add(int cur,int &x,int pos,int l=0,int r=n) { t[x=++cnt]=t[cur];if(l==r){++t[x].sz;return;}int mid=(l+r)>>1; pos<=mid?add(t[cur].l,t[x].l,pos,l,mid):add(t[cur].r,t[x].r,pos,mid+1,r);update(x); } inline int Qry(int ru,int rv,int rl,int l=0,int r=n) { if(l==r)return t[ru].sz+t[rv].sz-2*t[rl].sz?l:0; int res=t[t[ru].r].sz+t[t[rv].r].sz-2*t[t[rl].r].sz,mid=(l+r)>>1; if(res)return Qry(t[ru].r,t[rv].r,t[rl].r,mid+1,r);return Qry(t[ru].l,t[rv].l,t[rl].l,l,mid); } inline int qry(int ru,int rv,int rl,int w,int l=0,int r=n) { if(r<=w)return Qry(ru,rv,rl,l,r);int mid=(l+r)>>1; if(w<=mid)return qry(t[ru].l,t[rv].l,t[rl].l,w,l,mid); return max(qry(t[ru].l,t[rv].l,t[rl].l,w,l,mid),qry(t[ru].r,t[rv].r,t[rl].r,w,mid+1,r)); } } using namespace HJTree; namespace Sub0 { inline void dfs2(int u=1,int fa=0) { if(fa)add(Rt[fa],Rt[u],w[u]); grep(u,i)if(des[i]!=fa)dfs2(des[i],u); } inline void mian() { dfs2();int Q=read();while(Q--) { int u=read(),v=read(),R=read(),L=qry(Rt[u],Rt[v],Rt[LCA(u,v)],R); printf("%d\n",R-qry(Rt[u],Rt[v],Rt[LCA(u,v)],R),L); } } } bool qvis[N]; int main() { n=read();rep(2,n,i)ins(read(),read(),read()); dfs0();dfs1();bool flag=0;rep(2,n,i)if(qvis[w[i]]){flag=true;break;}else qvis[w[i]]=true; if(!flag)return Sub0::mian(),0;Sub0::mian();return 0; }