玄关,结尾有数据
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=4e4+5;
int n,p,q;vector<int>g[N];
int lisan[N],lisantot;
int dfn[N],siz[N],tim,fa[N][20],deep[N];
void dfs(int x){
deep[x]=deep[fa[x][0]]+1;siz[x]=1;dfn[x]=++tim;
for(int i=1;i<=log2(deep[x]);i++)fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i:g[x]){
if(i==fa[x][0])continue;fa[i][0]=x;dfs(i);siz[x]+=siz[i];
}
}
struct abc{
int x,y1,y2,w,k,id;
}z[N*2];int ans[N],len;
bool cmp(abc a,abc b){
if(a.x==b.x)return a.k>b.k;return a.x<b.x;
}
//树套树部分
int rt[N*20*40],ls[N*20*40],rs[N*20*40],tree[N*20*40],tot,root;
void update(int x,int l,int r,int ql,int qr,int w){
if(ql<=l&&qr>=r){
tree[x]+=w;return;
}
int mid=(l+r)/2;
if(ql<=mid){
if(!ls[x])ls[x]=++tot;update(ls[x],l,mid,ql,qr,w);
}
if(qr>mid){
if(!rs[x])rs[x]=++tot;update(rs[x],mid+1,r,ql,qr,w);
}
}
int query(int x,int l,int r,int p){
if(!x)return 0;if(l==r)return tree[x];
int mid=(l+r)/2,re=tree[x];
if(p<=mid){
if(ls[x])re+=query(ls[x],l,mid,p);
}
if(p>mid){
if(rs[x])re+=query(rs[x],mid+1,r,p);
}
return re;
}
void upd(int x,int l,int r,int p,int ql,int qr,int w){
if(rt[x]==0)rt[x]=++tot;
update(rt[x],1,n,ql,qr,w);
if(l==r)return;
int mid=(l+r)/2;
if(p<=mid){
if(!ls[x]){
ls[x]=++tot;
}
upd(ls[x],l,mid,p,ql,qr,w);
}else{
if(!rs[x])rs[x]=++tot;upd(rs[x],mid+1,r,p,ql,qr,w);
}
}
int kth(int x,int l,int r,int p,int k){
if(!x||l==r)return l;
int mid=(l+r)/2,tmp=query(rt[ls[x]],1,n,p);
if(tmp<k)return kth(rs[x],mid+1,r,p,k-tmp);
else return kth(ls[x],l,mid,p,k);
}
int main(){
read(n);read(p);read(q);
for(int u,v,i=1;i<n;i++){
read(u);read(v);g[u].push_back(v);g[v].push_back(u);
}
dfs(1);
for(int u,v,w,i=1;i<=p;i++){
read(u);read(v);read(w);
lisan[++lisantot]=w;if(dfn[u]>dfn[v])swap(u,v);
if(dfn[v]<dfn[u]+siz[u]){
int tmp=v;
for(int i=log2(deep[tmp]);i>=0;i--){
if(deep[fa[tmp][i]]>deep[u])tmp=fa[tmp][i];
}
if(dfn[tmp]>1){
z[++len]=(abc){1,dfn[v],dfn[v]+siz[v]-1,w,1,0};
z[++len]=(abc){dfn[tmp]-1,dfn[v],dfn[v]+siz[v]-1,w,-1,0};
}
if(dfn[tmp]+siz[tmp]<=n){
z[++len]=(abc){dfn[v],dfn[tmp]+siz[tmp],n,w,1,0};
z[++len]=(abc){dfn[v]+siz[v]-1,dfn[tmp]+siz[tmp],n,w,-1,0};
}
}else{
z[++len]=(abc){dfn[u],dfn[v],dfn[v]+siz[v]-1,w,1,0};
z[++len]=(abc){dfn[u]+siz[u]-1,dfn[v],dfn[v]+siz[v]-1,w,-1,0};
}
}
for(int i=1;i<=len;i++){
// cout<<z[i].x<<' '<<z[i].y1<<' '<<z[i].y1<<' '<<z[i].w<<' '<<z[i].k<<' '<<z[i].id<<endl;
}
sort(lisan+1,lisan+1+lisantot);lisantot=unique(lisan+1,lisan+1+lisantot)-lisan-1;
for(int i=1;i<=q;i++){
len++;z[len].id=i;read(z[len].x);read(z[len].y1);read(z[len].w);z[len].x=dfn[z[len].x];
z[len].y1=dfn[z[len].y1];if(z[len].x>z[len].y1)swap(z[len].x,z[len].y1);
}
sort(z+1,z+1+len,cmp);
root=++tot;
for(int i=1;i<=len;i++){
cout<<z[i].x<<' '<<z[i].y1<<' '<<z[i].y1<<' '<<z[i].w<<' '<<z[i].k<<' '<<z[i].id<<endl;
if(!z[i].k){
ans[z[i].id]=lisan[kth(root,1,lisantot,z[i].y1,z[i].w)];
}else{
upd(root,1,lisantot,lower_bound(lisan+1,lisan+1+lisantot,z[i].w)-lisan,z[i].y1,z[i].y2,z[i].k);
}
}
for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
return 0;
}
/*
3 3 3
1 2
1 3
1 2 1
1 2 2
1 3 4
1 2 1
1 3 2
2 3 1
4
4
4
*/