1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| #include<bits/stdc++.h>
using namespace std; int n,p,q,dfn[40010],dep[40010],siz[40010],ba[40010][17],dfntot; vector<int>e[40010]; int li[200010],lcnt,rt[200010]; inline void dfs(int u){ for(int i=1;i<17;i++)ba[u][i]=ba[ba[u][i-1]][i-1]; dfn[u]=++dfntot; siz[u]=1; for(auto v:e[u]){ if(v==ba[u][0])continue; ba[v][0]=u; dep[v]=dep[u]+1; dfs(v); siz[u]+=siz[v]; } } inline int lca(int u,int v){ if(dep[u]<dep[v])swap(u,v); for(int i=16;i>=0;i--)if(dep[u]-dep[v]-1>=(1<<i))u=ba[u][i]; if(ba[u][0]==v)return u; u=ba[u][0]; for(int i=16;i>=0;i--)if(ba[u][i]!=ba[v][i])u=ba[u][i],v=ba[v][i]; return u; } inline int lowbit(int x){ return x&-x; } int sum[10000010],tot,ls[10000010],rs[10000010]; inline void change(int &k,int l,int r,int pos,int val){ if(!k)k=++tot; sum[k]+=val; if(l==r)return; int mid(l+r>>1); if(pos<=mid)change(ls[k],l,mid,pos,val); else change(rs[k],mid+1,r,pos,val); } int bb[40010],bcnt; inline int query(int l,int r,int val){ if(l==r)return l; int t=0; for(int i=1;i<=bcnt;i++)t+=sum[ls[bb[i]]]; int mid(l+r>>1); if(val<=t){ for(int i=1;i<=bcnt;i++)bb[i]=ls[bb[i]]; return query(l,mid,val); } for(int i=1;i<=bcnt;i++)bb[i]=rs[bb[i]]; return query(mid+1,r,val-t); } inline void modify(int l,int r,int val,int z){ for(int i=l;i<=n;i+=lowbit(i))change(rt[i],1,lcnt,val,z); for(int i=r+1;i<=n;i+=lowbit(i))change(rt[i],1,lcnt,val,-z); } inline int ask(int l,int r){ bcnt=0; for(int i=l;i>=1;i-=lowbit(i))bb[++bcnt]=rt[i]; return query(1,lcnt,r); } struct no{ int typ,x,l,r,a,id; }que[300010]; int qcnt,ans[200010]; inline void cutup(int x1,int y1,int x2,int y2,int w){ if(x1>x2 or y1>y2)return; que[++qcnt]={2,x2,y1,y2,w}; que[++qcnt]={0,x1,y1,y2,w}; que[++qcnt]={0,y1,x1,x2,w}; que[++qcnt]={2,y2,x1,x2,w}; } int t1[40010],t2[40010],t3[40010]; main(){ cin.tie(0)->ios::sync_with_stdio(0); cin>>n>>p>>q; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; e[u].push_back(v); e[v].push_back(u); } dfs(1); for(int i=1;i<=p;i++){ int a,b,c; cin>>a>>b>>c; t1[i]=a,t2[i]=b,t3[i]=c; li[++lcnt]=c; } sort(1+li,1+li+lcnt); lcnt=unique(1+li,1+li+lcnt)-li-1; for(int i=1;i<=p;i++){ int a=t1[i],b=t2[i],c=lower_bound(1+li,1+li+lcnt,t3[i])-li; if(dep[a]>dep[b])swap(a,b); if(dfn[a]+siz[a]-1>=dfn[b] and dfn[a]<=dfn[b]){ int x=lca(a,b); cutup(1,dfn[b],dfn[x]-1,dfn[b]+siz[b]-1,c); cutup(dfn[x]+siz[x],dfn[b],n,dfn[b]+siz[b]-1,c); }else cutup(dfn[a],dfn[b],dfn[a]+siz[a]-1,dfn[b]+siz[b]-1,c); } for(int i=1;i<=q;i++){ int u,v,k; cin>>u>>v>>k; que[++qcnt]={1,dfn[u],dfn[v],dfn[v],k,i}; } sort(1+que,1+que+qcnt,[&](no x,no y){ if(x.x==y.x)return x.typ<y.typ; return x.x<y.x; }); for(int i=1;i<=qcnt;i++){ if(que[i].typ==0)modify(que[i].l,que[i].r,que[i].a,1); if(que[i].typ==1)ans[que[i].id]=ask(que[i].l,que[i].a); if(que[i].typ==2)modify(que[i].l,que[i].r,que[i].a,-1); } for(int i=1;i<=q;i++)cout<<li[ans[i]]<<'\n'; return 0; }
|