exit with code233
233那一行是想判一下父子节点siz是否相同的,然后炸了。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
int n,n1,m,q,a[200010],u,v,w,ans,f[200010],dep[200010],fa[20][200010],tot,P[200010];
struct edge{
int u,v,w;
}e[500010];
bool cmp(edge x,edge y){
return x.w<y.w;
}
vector <int> ve1[200010];
int ff0(int x){
if(f[x]==x) return x;
return f[x]=ff0(f[x]);
}
struct Node{
int l,r,mid,ls,rs;
int siz;
}N[30000010];
int nwd(int l,int r){
int p=++tot;
N[p].l=l;N[p].r=r;N[p].mid=(l+r)>>1;
N[p].ls=N[p].rs=N[p].siz=0;
return p;
}
void pup(int p){
N[p].siz=N[N[p].ls].siz+N[N[p].rs].siz;
}
void add(int pos,int p){
if(N[p].l==N[p].r){
N[p].siz++;
return;
}
if(pos<=N[p].mid){
if(!N[p].ls) N[p].ls=nwd(N[p].l,N[p].mid);
add(pos,N[p].ls);
}
else{
if(!N[p].rs) N[p].rs=nwd(N[p].mid+1,N[p].r);
add(pos,N[p].rs);
}
pup(p);
}
void merg(int p1,int p2){
if(N[p1].l==N[p1].r){
N[p1].siz+=N[p2].siz;
return;
}
if(!N[p1].ls) N[p1].ls=N[p2].ls;
else{
if(N[p2].ls) merg(N[p1].ls,N[p2].ls);
}
if(!N[p1].rs) N[p1].rs=N[p2].rs;
else{
if(N[p2].rs) merg(N[p1].rs,N[p2].rs);
}
pup(p1);
}
void dfs(int x){
for(int i=1;i<20;i++){
fa[i][x]=fa[i-1][fa[i-1][x]];
}
P[x]=nwd(1,1000000000);
if(x<=n1){
add(a[x],P[x]);
}
for(auto i:ve1[x]){
fa[0][i]=x;dep[i]=dep[x]+1;
dfs(i);
merg(P[x],P[i]);
}
}
int query(int k,int p){
if(N[p].l==N[p].r) return N[p].l;
if(N[p].siz!=N[N[p].ls].siz+N[N[p].rs].siz){
cout<<N[p].ls<<' '<<N[p].rs<<' '<<N[0].siz;
exit(233);
}
if(N[p].rs){
if(k<=N[N[p].rs].siz) return query(k,N[p].rs);
else k-=N[N[p].rs].siz;
}
return query(k,N[p].ls);
}
int main(){
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
cin>>n>>m>>q;n1=n;
for(int i=1;i<=n;i++){
cin>>a[i];f[i]=i;f[n+i]=n+i;
}
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++){
u=ff0(e[i].u);v=ff0(e[i].v);
if(u==v) continue;
n++;
ve1[n].push_back(u);
ve1[n].push_back(v);
f[u]=n;f[v]=n;a[n]=e[i].w;
}
for(int i=n1+1;i<=n;i++){
if(f[i]==i) dfs(i);
}
for(int i=1;i<=q;i++){
cin>>u>>v>>w;
u=(u^ans)%n1+1;
w=(w^ans)%n1+1;
v=v^ans;
for(int j=19;~j;j--){
if(fa[j][u]&&a[fa[j][u]]<=v) u=fa[j][u];
}
// cout<<ve1[u][0]<<' '<<ve1[u][1]<<'\n';
if(N[P[u]].siz<w){
ans=-1;
}
else{
ans=query(w,P[u]);
}
cout<<ans<<'\n';
}
return 0;
}