为何疯狂 RE。
#include<bits/stdc++.h>
#define ls tr[p].l
#define rs tr[p].r
#define I inline
#define RI register int
#define rep(i,a,b) for(RI i=a;i<=b;++i)
#define dow(i,a,b) for(RI i=a;i>=b;--i)
#define edg(i,u,v) for(RI v,i=head[u];v=e[i].to,i;i=e[i].next)
using namespace std;
const int N=500005;
struct node{ int a,b,w,id; bool operator < (const node &a1) const{ return w<a1.w; }; } e[N],q[N];
struct tree{ int l,r,val,flag;tree(){ l=r=flag=val=0; } } tr[N<<3];
int n,m,Q,tot,fa[N],h[N],rt[N],ans[N];
I int find(int u){ return fa[u]==u?u:(fa[u]=find(fa[u])); }
I void update(int l,int r,int pos,int &p){
if(!p) p=++tot;tr[p].val=1;if(l==r) return tr[p].flag=1,void();
RI mid=l+r>>1;if(pos>mid) update(mid+1,r,pos,rs);else update(l,mid,pos,ls);
}
I int merge(int x,int y){
if(!x||!y) return x|y;
if(tr[x].flag) return tr[x].val+=tr[y].val,x;
tr[x].l=merge(tr[x].l,tr[y].l);
tr[x].r=merge(tr[x].r,tr[y].r);
return tr[x].val=tr[tr[x].l].val+tr[tr[x].r].val,x;
}
I int query(int p,int l,int r,int k){
if(l==r) return l;RI mid=l+r>>1;
if(tr[rs].val>=k) query(rs,mid+1,r,k);
else return query(ls,l,mid,k-tr[rs].val);
}
int main(){
scanf("%d%d%d",&n,&m,&Q);
rep(i,1,n) scanf("%d",&h[i]),update(0,1e9,h[i],rt[i]),fa[i]=i;
rep(i,1,m) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
sort(e+1,e+m+1);
rep(i,1,Q) scanf("%d%d%d",&q[i].a,&q[i].w,&q[i].b),q[i].id=i;
sort(q+1,q+Q+1);
RI mj=1;
rep(i,1,Q){
while(e[mj].w<=q[i].w&&mj<=m){
RI x=find(e[mj].a),y=find(e[mj].b);
if(x^y) fa[y]=x,rt[x]=merge(rt[x],rt[y]);++mj;
}
RI x=find(q[i].a);
ans[q[i].id]=tr[rt[x]].val<q[i].b?-1:query(rt[x],0,1e9,q[i].b);
}
rep(i,1,Q) printf("%d\n",ans[i]);
return 0;
}