题目链接
#include<bits/stdc++.h>
#define mid ((l + r) / 2)
using namespace std;
constexpr int N = 200005;
int n , m , a[N] , b[N] , dfn[N] ,deg[N] , val[N];
int root[N] , tot , q;
int ls[N * 20] , rs[N* 20] , sum[N * 20],Cnt,head[N],fa[N],in[N],f[N][20],size[N],out[N],h[N];
struct node {
int x , y , w;
} e[N];
struct Node {
int to , nxt;
} edge[N];
void add(int u, int v) {
edge[++Cnt]=(Node) {
v, head[u]
};
head[u]=Cnt;
deg[v]++;
}
bool cmp(node a, node b) {
return a.w<b.w;
}
int find(int x) {
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void dfs(int u) {
dfn[++tot]=u;
in[u]=tot;
for (int i=1; (1<<i)<=(n<<1); i++) f[u][i]=f[f[u][i-1]][i-1];
for (int i=head[u]; i; i=edge[i].nxt) {
int v=edge[i].to;
if (v==f[u][0]) continue;
f[v][0]=u;
dfs(v);
size[u]+=size[v];
}
if (!size[u]) size[u]=1;
out[u]=tot;
}
void build(int &u , int l , int r) {
u = ++tot;
if(l == r) return;
build(ls[u] , l , mid);
build(rs[u] , mid + 1, r);
}
void change(int &u , int v , int l , int r , int p) {
u = ++tot;
ls[u] = ls[v];
rs[u] = rs[v];
sum[u] = sum[v] + 1;
if(l == r) return ;
if(p <= mid) change(ls[u] , ls[v] , l , mid ,p);
else change(rs[u] , rs[v] , mid + 1 , r , p);
}
int query(int u ,int v ,int l ,int r ,int k) {
if(l == r) return l;
int s = sum[ls[u]] - sum[ls[v]];
if(s >= k) return query(ls[u] , ls[v] , l , mid , k);
else return query(rs[u] , rs[v] , mid + 1, r , k - s);
}
int main() {
cin >> n >> m >> q;
for(int i = 1 ; i <= n ; i++){
cin >> h[i];
b[i] = h[i];
}
for(int i = 1 ; i <= m ; i++){
cin >> e[i].x >> e[i].y >> e[i].w;
}
sort(e + 1 , e + m + 1 , cmp);
for(int i = 1 ; i <= n ; i++){
fa[i] = i;
}
int nn = n;
for(int i = 1 ; i <= m ; i++){
int fx = find(e[i].x);
int fy = find(e[i].y);
if(fx^fy){
val[++nn] = e[i].w;
fa[fx] = fa[fy] = 0;
add(nn,fx);
add(nn,fy);
}
}
for(int i = 1 ; i <= n ; i++){
if(!deg[i]) dfs(i);
}
for(int i = 1 ; i <= n ; i++){
b[i] = h[dfn[i]];
}
sort(b + 1 , b + n + 1);
int bn = unique(b + 1 , b + n + 1) - b - 1;
for(int i = 1 ; i <= n ; i++) {
int p = lower_bound(b + 1 , b + bn + 1 ,a[i]) - b;
change(root[i] , root[i - 1] , 1 , bn ,p);
}
while(q--) {
int l , r , k;
cin >> l >> r >> k;
int p = query(root[r] , root[l - 1] , 1 , bn, k);
cout << b[p] << endl;
}
}