后两个点疯狂WA
#include<bits/stdc++.h>
#define N 200005
#define int long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,q,a[N],e[N],t[N],cnt,tot,head[N],awa,p[N],size[N],l[N],r[N],val[N];
int fa[N*2][20],deep[N*2],num,rt[N],lans;
struct edge
{
int u,v,w;
}g[N*3];
struct tree
{
int from,to,next;
}tr[N*3];
struct awa
{
int l,r,size;
}k[N*20];
bool cmp(int a,int b){return a<b;}
bool gru(edge a,edge b){return a.w<b.w;}
int find(int now)
{
if(t[now]==now)return now;
else return t[now]=find(t[now]);
}
void add(int from,int to)
{
tr[++tot].from=from;
tr[tot].to=to;
tr[tot].next=head[from];
head[from]=tot;
}
void dfs(int now,int f)
{
fa[now][0]=f;
deep[now]=deep[f]+1;
l[now]=100000008;
for(int i=1;i<=19;i++)fa[now][i]=fa[fa[now][i-1]][i-1];
for(int i=head[now];i;i=tr[i].next)
{
dfs(tr[i].to,now);
l[now]=min(l[now],l[tr[i].to]);
r[now]=max(r[now],r[tr[i].to]);
size[now]+=size[tr[i].to];
}
if(size[now]==0)
{
p[++awa]=now;
l[now]=r[now]=awa;
size[now]=1;
}
}
int lca(int a,int pt)
{
for(int i=19;i>=0;i--)
{
if(val[fa[a][i]]<=pt&&fa[a][i]!=0)a=fa[a][i];
}
return a;
}
int build(int l,int r)
{
int to=++num;
if(l==r)return to;
int mid=(l+r)>>1;
k[to].l=build(l,mid);
k[to].r=build(mid+1,r);
return to;
}
void hb(int now){k[now].size=k[k[now].l].size+k[k[now].r].size;}
int news(int now)
{
++num;
k[num]=k[now];
return num;
}
int update(int now,int l,int r,int x)
{
int to=news(now);
int mid=(l+r)>>1;
if(l==r)
{
k[to].size++;
return to;
}
if(x<=mid)k[to].l=update(k[now].l,l,mid,x);
else k[to].r=update(k[now].r,mid+1,r,x);
hb(to);
return to;
}
void que(int l,int r,int now,int cl,int cr)
{
int cnt=k[k[r].r].size-k[k[l].r].size;
if(cl==cr)
{
lans=cl;
cout<<e[cl]<<"\n";
return ;
}
int mid=(cl+cr)>>1;
if(cnt>=now)que(k[l].r,k[r].r,now,mid+1,cr);
else que(k[l].l,k[r].l,now-cnt,cl,mid);
}
signed main()
{
n=read();m=read();q=read();
for(int i=1;i<=n;i++)a[i]=read(),e[i]=a[i];
sort(e+1,e+1+n);int len=unique(e+1,e+1+n)-e-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(e+1,e+1+len,a[i])-e;
for(int i=1;i<=m;i++)
{
g[i].u=read();
g[i].v=read();
g[i].w=read();
}
sort(g+1,g+1+n,gru);
for(int i=1;i<=n*2;i++)t[i]=i;
cnt=n;
for(int i=1,u,v;i<=m;i++)
{
u=find(g[i].u);v=find(g[i].v);
if(u!=v)
{
++cnt;val[cnt]=g[i].w;
add(cnt,u);add(cnt,v);
t[u]=cnt;t[v]=cnt;
}
}
for(int i=cnt;i>=1;i--)if(!deep[i])dfs(i,0);
rt[0]=build(1,len);
for(int i=1;i<=n;i++)rt[i]=update(rt[i-1],1,len,a[p[i]]);
int U,X,K,y;
while(q--)
{
U=read();X=read();K=read();
y=lca(U,X);
if(size[y]<K)cout<<-1<<"\n",lans=0;
else que(rt[l[y]-1],rt[r[y]],K,1,len);
}
return 0;
}
最后一个输出里有 - 不知道是判断为 −1 还是炸了