RT,一直TLE,根本卡不动常数
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#define endl '\n'
using namespace std;
ifstream fin;
ofstream fout;
struct node{
int ch[2],rev,fa;
vector<int>key,mn;
};
node lct[200005];
vector<int> merge(vector<int>s1,vector<int>s2){
vector<int>res;
auto it1=s1.begin(),it2=s2.begin();
while(it1!=s1.end()&&it2!=s2.end()&&res.size()<=10){
if(*it1<=*it2)res.push_back(*(it1++));
else res.push_back(*(it2++));
}
while(it1!=s1.end()&&res.size()<=10)res.push_back(*(it1++));
while(it2!=s2.end()&&res.size()<=10)res.push_back(*(it2++));
return res;
}
inline void update(int p){
int l=lct[p].ch[0],r=lct[p].ch[1];
lct[p].mn=merge(lct[p].key,merge(lct[l].mn,lct[r].mn));
}
inline void pushr(int p){
int&l=lct[p].ch[0],&r=lct[p].ch[1];
swap(l,r);
lct[p].rev^=1;
}
inline void pushdown(int p){
int l=lct[p].ch[0],r=lct[p].ch[1];
if(lct[p].rev){
if(l)pushr(l);
if(r)pushr(r);
lct[p].rev=0;
}
}
inline bool isroot(int p){
return (lct[lct[p].fa].ch[0]!=p)&&(lct[lct[p].fa].ch[1]!=p);
}
inline void rotate(int p){
int f=lct[p].fa,ff=lct[f].fa;
if(!isroot(f))lct[ff].ch[(lct[ff].ch[1]==f)]=p;
int l=(lct[f].ch[1]==p),r=!l;
lct[f].fa=p;
lct[p].fa=ff;
lct[lct[p].ch[r]].fa=f;
lct[f].ch[l]=lct[p].ch[r];
lct[p].ch[r]=f;
update(f);
update(p);
}
int st[100005],tp;
inline void splay(int p){
tp=0;
st[++tp]=p;
for(int i=p;!isroot(i);i=lct[i].fa)st[++tp]=lct[i].fa;
while(tp)pushdown(st[tp--]);
while(!isroot(p)){
int f=lct[p].fa,ff=lct[f].fa;
if(!isroot(f)){
if((lct[ff].ch[1]==f)^(lct[f].ch[1]==p))rotate(p);
else rotate(f);
}
rotate(p);
}
}
void access(int p){
for(int i=0;p;p=lct[p].fa){
splay(p);
lct[p].ch[1]=i;
update(p);
i=p;
}
}
void makeroot(int p){
access(p);
splay(p);
pushr(p);
}
int split(int x,int y){
makeroot(x);
access(y);
splay(y);
return y;
}
void query(int x,int y,int a){
int p=split(x,y);
int cnt=0;
cout<<min(a,(int)lct[p].mn.size())<<' ';
for(auto it=lct[p].mn.begin();it!=lct[p].mn.end();it++){
cout<<*it<<' ';
cnt++;
if(cnt>=a)break;
}
cout<<endl;
}
void link(int x,int y){
makeroot(x);
splay(y);
lct[x].fa=y;
}
int u[100005],v[100005];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<n;i++)cin>>u[i]>>v[i];
for(int i=1;i<=m;i++){
int x;
cin>>x;
lct[x].key.push_back(i);
}
for(int i=1;i<=n;i++){
sort(lct[i].key.begin(),lct[i].key.end());
update(i);
}
for(int i=1;i<n;i++)link(u[i],v[i]);
while(q--){
int x,y,a;
cin>>x>>y>>a;
query(x,y,a);
}
return 0;
}