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
| #include<bits/stdc++.h> #define maxn 200005 #define ll long long #define put() putchar('\n') using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } int n,m,q; int h[maxn]; struct yyy{int x,y,z;}e[1000005]; inline bool cmp(yyy x,yyy y){return x.z<y.z;} int father[maxn],w[maxn],fa[maxn][21],deep[maxn],lg[maxn]; int to[maxn][2],root[maxn],times,ql[maxn],qr[maxn],id[maxn]; inline int getfa(int x) {return x==father[x]?x:father[x]=getfa(father[x]);} inline void dfs(int x,int pre) { if (!x) return ; ql[x]=++times;id[times]=x; int i;deep[x]=deep[pre]+1;fa[x][0]=pre; for (i=1;i<=lg[deep[x]];i++) fa[x][i]=fa[fa[x][i-1]][i-1]; dfs(to[x][0],x);dfs(to[x][1],x); qr[x]=times; } const int base=1e9; struct node{int ls,rs,size;}f[maxn*50]; int fnum; inline int Update(int l,int r,int pre,int head,int k) { int rt; f[rt=++fnum]=f[pre];f[rt].size++; if (l==r) return rt; int mid=l+r>>1; if (head<=mid) f[rt].ls=Update(l,mid,f[rt].ls,head,k); else f[rt].rs=Update(mid+1,r,f[rt].rs,head,k); return rt; } inline int Query(int l,int r,int rt1,int rt2,int k) { if (l==r) return l; int mid=l+r>>1,s=f[f[rt2].rs].size-f[f[rt1].rs].size; if (k<=s) return Query(mid+1,r,f[rt1].rs,f[rt2].rs,k); else return Query(l,mid,f[rt1].ls,f[rt2].ls,k-s); } inline void init(void) { int i;int cnt=n; sort(e+1,e+1+m,cmp); for (i=1;i<=n*2;i++) father[i]=i; for (i=2;i<=n*2;i++) lg[i]=lg[i/2]+1; for (i=1;i<=m;i++) { int fx=getfa(e[i].x),fy=getfa(e[i].y); if (fx^fy) { w[++cnt]=e[i].z; to[cnt][0]=fx;to[cnt][1]=fy; father[fx]=father[fy]=cnt; } }
for (i=1;i<=cnt;i++) if (father[i]==i )dfs(i,0); root[0]=fnum=1; for (i=1;i<=cnt;i++) { if (id[i]<=n) root[i]=Update(1,base,root[i-1],h[id[i]],1); else root[i]=root[i-1]; } } signed main(void){ freopen("mountain.in","r",stdin); freopen("mountain2.out","w",stdout); int las=0,i,j,x,y,z; read(n);read(m);read(q); for (i=1;i<=n;i++) read(h[i]); for (i=1;i<=m;i++) read(e[i].x),read(e[i].y),read(e[i].z); init();
while (q--) { read(x);read(y);read(z); if (las>0) x^=las,y^=las,z^=las; for (i=20;i>=0;i--) if (fa[x][i]&&w[fa[x][i]]<=y) x=fa[x][i]; if (f[root[qr[x]]].size-f[root[ql[x]-1]].size<z) las=-1; else las=Query(1,base,root[ql[x]-1],root[qr[x]],z); printf("%d\n",las); } return 0; }
|