rt,不知道是被卡空间还是怎么样,数组开大就 MLE 数组开小就 RE
目前已知 RE 部分已在程序内标出(注释掉就不会RE了,但会MLE)
实在调不出来了qwq
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
int r=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')f=0;
c=getchar();
}
while(isdigit(c))
{
r=(r<<1)+(r<<3)+c-48;
c=getchar();
}
return f?r:-r;
}
const int N=2e5+5;
int n,m,q,h[N],ff[N],val[N],cnt;
int Map[N];
int find(int x,int dep=0)
{
if(ff[x]==x) return x;
return ff[x]=find(ff[x],dep+1);
}
struct node
{
int x,y,w;
}a[500005];
bool cmp(node a,node b)
{
return a.w<b.w;
}
struct tree
{
int l,r,sum=0;
}tr[N*22];
int scnt=0;
int update(int p,int l,int r,int val)
{
scnt++;
int kkk=scnt;
tr[kkk].sum=tr[p].sum+1;
if(l==r) return kkk;
int mid=(l+r)>>1;
if(val<=mid)
{
tr[kkk].r=tr[p].r;
tr[kkk].l=update(tr[p].l,l,mid,val);
}
else
{
tr[kkk].l=tr[p].l;
tr[kkk].r=update(tr[p].r,mid+1,r,val);
}
return kkk;
}
int dfn[N],idx,fa[N][20],rd[N],rt[N],siz[N];
int head[N],to[N],nxt[N],cntt;
void add(int u,int v)
{
to[++cntt]=v;
nxt[cntt]=head[u];
head[u]=cntt;
}
//建立主席树
void dfs(int now,int f)
{
fa[now][0]=f;
dfn[now]=++idx;
for(int i=1;i<=15;i++)
fa[now][i]=fa[fa[now][i-1]][i-1];
if(h[now]==-114514) rt[idx]=rt[idx-1]; //新建的节点没有高度,不加入主席树
else rt[idx]=update(rt[idx-1],1,1e5,h[now]);
siz[now]=1;
for(int i=head[now];i;i=nxt[i])
{
int v=to[i];
dfs(v,now);
siz[now]+=siz[v];
}
}
int query(int p1,int p2,int l,int r,int k)
{
if(l==r)
{
if(k>1) return 0;
else return l;
}
int ss=tr[tr[p2].r].sum-tr[tr[p1].r].sum,mid=(l+r)>>1;
if(k>ss) return query(tr[p1].l,tr[p2].l,l,mid,k-ss);
else return query(tr[p1].r,tr[p2].r,mid+1,r,k);
}
signed main()
{
n=read();m=read();q=read();
cnt=n;
for(int i=1;i<=n;i++)
Map[i]=h[i]=read();
for(int i=1;i<=n;i++)
ff[i]=i;
for(int i=1;i<=m;i++)
{
a[i].x=read();
a[i].y=read();
a[i].w=read();
}
sort(Map+1,Map+1+m);
int tot=unique(Map+1,Map+1+m)-Map-1;
for(int i=1;i<=m;i++)
h[i]=lower_bound(Map+1,Map+1+tot,h[i])-Map;
sort(a+1,a+1+m,cmp);
int kk=0;
for(int i=1;i<=m;i++)
{
int xx=find(a[i].x),yy=find(a[i].y);//就是这个 SB 并查集 RE 真不知道这怎么 RE
if(xx!=yy)
{
cnt++;
ff[xx]=ff[yy]=cnt;
ff[cnt]=cnt; val[cnt]=a[i].w;
h[cnt]=-114514;
kk++; rd[xx]++; rd[yy]++;
add(cnt,xx);
add(cnt,yy);
}
}
for(int i=1;i<=cnt;i++)
if(rd[i]==0) dfs(i,0);
Map[0]=-1;
int v,x,k;
while(q--)
{
v=read(),x=read(),k=read();
for(int i=15;i>=0;i--)
if(fa[v][i]!=0&&val[fa[v][i]]<=x)
v=fa[v][i];
printf("%lld\n",Map[query(rt[dfn[v]-1],rt[dfn[v]+siz[v]-1],1,1e5,k)]);
}
}