1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include<bits/stdc++.h> #define ll long long
#define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) #define PII pair<int,int> const int MOD=998244353; const int N=2000002; const int M=10000001; using namespace std; inline int read(){register char c=getchar();register int s=0,f=1;for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())s=(s<<3)+(s<<1)+c-'0';return s*f;} int n,m,q; int h[N],a[N]; int tot; int v[N]; int fa[N][21]; struct edge{ int a,b,d; bool operator <(const edge x)const{ return d<x.d; } }E[M]; int faf[N]; int find(int x){return x==faf[x]?x:faf[x]=find(faf[x]);} int ch[N][2]; int cnt; int idl[N]; int idr[N]; void kruskal(){ stable_sort(E+1,E+m+1); for(int i=1;i<=n;i++) faf[i]=i; for(int i=1;i<=m;i++){ int Fa=find(E[i].a),Fb=find(E[i].b); if(Fa==Fb)continue; v[++tot]=E[i].d; faf[tot]=tot; ch[tot][0]=Fa,ch[tot][1]=Fb; faf[Fa]=faf[Fb]=tot; } } int rt[N],cn; struct node{ int l,r,cn; #define l(x) tr[x].l #define r(x) tr[x].r #define cn(x) tr[x].cn }tr[N]; int build(int l,int r,int k,int pr){ int p=++cn; cn(p)=cn(pr)+1; if(l==r) return p; int mid=(l+r)>>1; if(k<=mid)l(p)=build(l,mid,k,l(pr)),r(p)=r(pr); else r(p)=build(mid+1,r,k,r(pr)),l(p)=l(pr); return p; } int ask(int l,int r,int k,int L,int R){ if(k>cn(R)-cn(L))return -1; if(l==r)return a[l]; int mid=(l+r)>>1; int sum=cn(r(R))-cn(r(L)); if(k<=sum)return ask(mid+1,r,k,r(L),r(R)); else return ask(l,mid,k-sum,l(L),l(R)); } void dfs(int p){ if(!ch[p][0]){ idl[p]=idr[p]=++cnt; rt[cnt]=build(1,n,h[p],rt[cnt-1]); return ; } fa[ch[p][0]][0]=fa[ch[p][1]][0]=p; dfs(ch[p][0]);dfs(ch[p][1]); idl[p]=idl[ch[p][0]]; idr[p]=idr[ch[p][1]]; } int main(){ n=read(),m=read(),q=read(); for(int i=1;i<=n;i++){h[i]=read();a[i]=h[i];} sort(a+1,a+n+1); for(int i=1;i<=n;i++)h[i]=lower_bound(a+1,a+n+1,h[i])-a; for(int i=1;i<=m;i++) E[i].a=read(),E[i].b=read(),E[i].d=read(); for(int i=2;i<=n;i++) E[++m].a=1,E[m].b=i,E[m].d=0x7fffffff; tot=n; kruskal(); dfs(tot); for(int i=1;i<=20;i++) for(int j=1;j<=tot;j++) fa[j][i]=fa[fa[j][i-1]][i-1]; while(q--){ int u=read(),x=read(),k=read(); for(int i=20;i>=0;i--) if(fa[u][i]&&v[fa[u][i]]<=x)u=fa[u][i]; printf("%d\n",ask(1,n,k,rt[idl[u]-1],rt[idr[u]])); } return 0; }
|