做法是离散化后离线然后线段树合并+权值线段树
参照离散化并离线版本的P3224永无乡
然后问题应该是在主程序里
现在50分,真的调不出来了
求大佬帮忙
#include <bits/stdc++.h>
#define N 1000010
#define M 2000010
#define pii pair<int,int>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
//#define int long long
#define int_edge int to[M],val[M],nxt[M],head[N],cnt=0;
#define ls(nw) tr[nw].ls
#define rs(nw) tr[nw].rs
using namespace std;
int n,m,Q,ans[N],a[N],h[N],fa[N],tot=0,rt[N],len;
struct Y{
int x,y,v;
}e[N];
struct Pat{
int x,v,k,id;
}q[N];
struct Tree{
int val,id,ls,rs;
}tr[N*40];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int insert(int nw,int l,int r,int x,int i){
if(!nw)nw=++tot;
if(l==r){
tr[nw].id=i;
tr[nw].val++;
return nw;
}
int mid=(l+r)/2;
if(x<=mid)ls(nw)=insert(ls(nw),l,mid,x,i);
if(x>mid)rs(nw)=insert(rs(nw),mid+1,r,x,i);
tr[nw].val=tr[ls(nw)].val+tr[rs(nw)].val;
return nw;
}
int merge(int x,int y,int l,int r){
if(!x)return y;
if(!y)return x;
if(x==y){if(tr[y].id){tr[x].id=tr[y].id,tr[x].val+=tr[y].val;}return x;}
int mid=(l+r)/2;
ls(x)=merge(ls(x),ls(y),l,mid);
rs(x)=merge(rs(x),rs(y),mid+1,r);
tr[x].val=tr[ls(x)].val+tr[rs(x)].val;
return x;
}
int query(int nw,int l,int r,int k){
if(tr[nw].val<k||!nw)return 0;
if(l==r)return tr[nw].id;
int mid=(l+r)/2;
if(k<=tr[rs(nw)].val)return query(rs(nw),mid+1,r,k);
return query(ls(nw),l,mid,k-tr[rs(nw)].val);
}
int cmp(Y x,Y y){return x.v<y.v;}
int cmp2(Pat x,Pat y){return x.v<y.v;}
void add(int x,int y){
x=find(x),y=find(y);
fa[y]=x;rt[x]=merge(rt[x],rt[y],1,len);
}
signed main()
{
scanf("%d %d %d",&n,&m,&Q);
for(int i=1;i<=n;i++)scanf("%d",&h[i]),a[i]=h[i];
sort(a+1,a+n+1);len=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++){
h[i]=lower_bound(a+1,a+len+1,h[i])-a;
fa[i]=i;rt[i]=insert(rt[i],1,len,h[i],i);
}
for(int i=1;i<=m;i++)scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].v);
for(int i=1;i<=Q;i++)scanf("%d %d %d",&q[i].x,&q[i].v,&q[i].k),q[i].id=i;
sort(e+1,e+m+1,cmp);sort(q+1,q+Q+1,cmp2);
int nw=1;
for(int i=1;i<=Q;i++){
while(nw<=m&&e[nw].v<=q[i].v)add(e[nw].x,e[nw].y),nw++;
int pos=query(rt[find(q[i].x)],1,len,q[i].k);
if(pos==0)ans[q[i].id]=-1;
else ans[q[i].id]=a[h[pos]];
}
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
return 0;
}