对于在图上限制最大边权的题,我们可以建一颗最小生成树,合并两个连通块的时候新建一个节点代表这条边,点权为边权,把两个连通块的子树都作为这个新点的儿子,然后用这个新点代表这个连通块
然后点x通过边权不大于y的边能到达的点就是点x在新树上点权小于等于y的最高祖先所代表的子树,这个可以倍增查询
于是就变成了查询子树K大,主席树即可
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
using namespace std;
#define MAXN 200010
#define MAXM 4000010
#define MAXE 500010
#define ll long long
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
struct vec{
int to;
int fro;
};
struct edg{
int v1;
int v2;
int v;
friend bool operator <(edg x,edg y){
return x.v<y.v;
}
};
edg e[MAXE];
int n,m,q;
int h[MAXN];
int f[MAXN],tp[MAXN];
int v[MAXN];
vec mp[MAXN];
int tai[MAXN],cnt;
int tot;
int fa[MAXN][21];
int tim;
int dfn[MAXN],ndf[MAXN];
int siz[MAXN];
int rt[MAXN];
int num[MAXM],son[MAXM][2];
int la;
int Fa(int x){
return f[x]==x?x:f[x]=Fa(f[x]);
}
inline void be(int x,int y){
mp[++cnt].to=y;
mp[cnt].fro=tai[x];
tai[x]=cnt;
}
void dfs(int x){
int i,j,y,t;
dfn[x]=++tim;
ndf[tim]=x;
siz[x]=1;
for(i=tai[x];i;i=mp[i].fro){
y=mp[i].to;
for(j=1,t=x;t;j++){
fa[y][j]=t;
t=fa[t][j];
}
dfs(y);
siz[x]+=siz[y];
v[x]=max(v[x],v[y]);
}
}
void change(int &x,int xx,int l,int r,int p){
x=++tot;
memcpy(son[x],son[xx],sizeof(son[x]));
num[x]=num[xx]+1;
if(l==r){
return ;
}
int mid=l+r>>1;
if(p<=mid){
change(son[x][0],son[xx][0],l,mid,p);
}else{
change(son[x][1],son[xx][1],mid+1,r,p);
}
}
int ask(int x,int xx,int l,int r,int k){
if(num[xx]-num[x]<k){
return -1;
}
if(l==r){
return l;
}
int mid=l+r>>1;
int t=num[son[xx][1]]-num[son[x][1]];
if(k<=t){
return ask(son[x][1],son[xx][1],mid+1,r,k);
}else{
return ask(son[x][0],son[xx][0],l,mid,k-t);
}
}
int toask(int x,int y,int z){
int i;
for(i=20;i;i--){
if(fa[x][i]&&v[fa[x][i]]<=y){
x=fa[x][i];
}
}
return ask(rt[dfn[x]-1],rt[dfn[x]+siz[x]-1],1,INF,z);
}
int main(){
int i,x,y,z;
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=n;i++){
scanf("%d",&h[i]);
f[i]=tp[i]=i;
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&e[i].v1,&e[i].v2,&e[i].v);
}
sort(e+1,e+m+1);
tot=n;
for(i=1;i<=m;i++){
x=e[i].v1;
y=e[i].v2;
if(Fa(x)!=Fa(y)){
tot++;
v[tot]=e[i].v;
be(tot,tp[Fa(x)]);
be(tot,tp[Fa(y)]);
f[Fa(x)]=Fa(y);
tp[Fa(y)]=tot;
}
}
dfs(tot);
tot=0;
for(i=1;i<=tim;i++){
if(h[ndf[i]]){
change(rt[i],rt[i-1],1,INF,h[ndf[i]]);
}else{
rt[i]=rt[i-1];
}
}
for(i=1;i<=q;i++){
if(la==-1){
la=0;
}
scanf("%d%d%d",&x,&y,&z);
x^=la;
y^=la;
z^=la;
printf("%d\n",la=toask(x,y,z));
}
return 0;
}
/*
10 11 4
1 2 3 4 5 6 7 8 9 10
1 4 4
2 5 3
9 8 2
7 8 10
7 1 4
6 7 1
6 4 8
2 1 5
10 8 10
3 4 7
3 4 6
1 5 2
1 5 6
1 5 8
8 9 2
*/