测试点都是line 1就错了,错的输出有的是-1有的是正数
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=5e5+5;
struct Segment_Tree
{
int ls,rs,cnt;
}tree[N<<4];
struct edge
{
int u,v,w;
bool operator <(const edge &x)const
{
return this->w<x.w;
}
}e[M];
int a[N>>1],t[N>>1],sz[N],id[N],L[N],R[N],from[N],f[N][25],lg[N],d[N],val[N],rt[N],n,len,tot=0,all=0;
vector<int> nodes[N];
void lsh()
{
for(int i=1;i<=n;i++)t[i]=a[i];
sort(t+1,t+n+1);
len=unique(t+1,t+n+1)-t;
for(int i=1;i<=n;i++)a[i]=lower_bound(t+1,t+len,a[i])-t;
return;
}
void build(int &p,int l,int r)
{
p=++tot;
if(l==r)return;
int mid=(l+r)>>1;
build(tree[p].ls,l,mid);
build(tree[p].rs,mid+1,r);
return;
}
int modify(int p,int l,int r,int x)
{
int o=++tot;
tree[o]=tree[p];
tree[o].cnt++;
if(l==r)return o;
int mid=(l+r)>>1;
if(x<=mid)tree[o].ls=modify(tree[o].ls,l,mid,x);
else tree[o].rs=modify(tree[o].rs,mid+1,r,x);
return o;
}
int query(int p1,int p2,int l,int r,int k)
{
int delta=tree[tree[p2].rs].cnt-tree[tree[p1].rs].cnt;
if(l==r)return l;
int mid=(l+r)>>1;
if(k<=delta)return query(tree[p1].rs,tree[p2].rs,mid+1,r,k);
else return query(tree[p1].ls,tree[p2].ls,l,mid,k-delta);
}
int find(int x)
{
if(x!=from[x])from[x]=find(from[x]);
return from[x];
}
void dfs(int u,int fa)
{
f[u][0]=fa,d[u]=d[fa]+1,L[u]=++all,id[all]=u;
for(int v:nodes[u])dfs(v,u),sz[u]+=sz[v];
R[u]=all;
if(!sz[u])sz[u]=1;
return;
}
int LCA(int u,int v)
{
if(d[u]<d[v])swap(u,v);
while(d[u]>d[v])u=f[u][lg[d[u]-d[v]]];
if(u==v)return u;
for(int i=lg[n];i>=0;i--)
{
if(f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
}
return f[u][0];
}
int main()
{
int m,q,ans=0;
scanf("%d %d %d",&n,&m,&q);
int nn=n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
lsh();
for(int i=1;i<=m;i++)scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
sort(e+1,e+m+1);
for(int i=1;i<(n<<1);i++)from[i]=i;
for(int i=1;i<=m;i++)
{
int ru=find(e[i].u),rv=find(e[i].v);
if(ru!=rv)
{
from[ru]=from[rv]=++n;
val[n]=e[i].w;
nodes[n].push_back(ru);
nodes[n].push_back(rv);
}
}
for(int i=1;i<=n;i++)if(find(i)==i)dfs(i,0);
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
for(int j=1;j<=lg[n];j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
for(int i=1;i<=all;i++)
{
if(id[i]<=nn)rt[i]=modify(rt[i-1],1,len,a[id[i]]);
else rt[i]=rt[i-1];
}
while(q--)
{
int u,x,k;
scanf("%d %d %d",&u,&x,&k);
u=(u^ans)%n+1,x^=ans,k=(k^ans)%n+1;
for(int i=21;i>=0;i--)if(f[u][i]&&val[f[u][i]]<=x)u=f[u][i];
if(sz[u]<k)ans=0,puts("-1");
else printf("%d\n",ans=t[query(rt[L[u]-1],rt[R[u]],1,len,k)]);
}
return 0;
}