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
   | vector<int> X; EDGE(MAXN,MAXN*2); int n,m,q,cnt,last=-1; int h[MAXN],a[MAXN],b[MAXN],fa[MAXN],st[MAXN],ed[MAXN],f[MAXN][21]; struct temp{int u,v,w;}edg[N]; int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} void dfs(int u,int fa) {     st[u]=++cnt,b[cnt]=h[u],f[u][0]=fa;     go(u)if(v!=fa)dfs(v,u);     ed[u]=cnt; } int root[MAXN],s[MAXN*10],ls[MAXN*10],rs[MAXN*10],cnt_; void update(int pre,int &rt,int l,int r,int pos) {     if(!rt)rt=++cnt_; s[rt]=s[pre]+1; if(l==r)return;     if(pos<=mid)update(ls[pre],ls[rt],l,mid,pos),rs[rt]=rs[pre];     else update(rs[pre],rs[rt],mid+1,r,pos),ls[rt]=ls[pre]; } void query(int pre,int rt,int l,int r,int k) {     if(l==r){printf("%d\n",X[l-1]),last=X[l-1];return;}     int sum=s[rs[rt]]-s[rs[pre]];     if(sum>=k)query(rs[pre],rs[rt],mid+1,r,k);     else query(ls[pre],ls[rt],l,mid,k-sum); } bool cmp(const temp &a,const temp &b){return a.w<b.w;} int work() {     scanf("%d%d%d",&n,&m,&q);     fp(i,1,n)scanf("%d",&h[i]),X.pb(h[i]); sort(all(X)),unq(X);     fp(i,1,n)h[i]=lb(all(X),h[i])-X.begin()+1;     fp(i,1,2*n)fa[i]=i;     fp(i,1,m)scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].w);     sort(edg+1,edg+1+m,cmp);     fp(i,1,m)if(find(edg[i].u)!=find(edg[i].v))     {         a[++n]=edg[i].w; int fu=find(edg[i].u),fv=find(edg[i].v);         addedge(n,fu),addedge(n,fv),fa[fu]=fa[fv]=n;     }     fp(i,1,n)if(!st[i])dfs(find(i),0);     fp(j,1,20)fp(i,1,n)f[i][j]=f[f[i][j-1]][j-1];     fp(i,1,n)         if(b[i])update(root[i-1],root[i],1,X.size(),b[i]);         else root[i]=root[i-1];     while(q--)     {         int u,x,k;scanf("%d%d%d",&u,&x,&k);         if(last!=-1)u^=last,x^=last,k^=last;         fd(i,20,0)if(f[u][i]&&a[f[u][i]]<=x)u=f[u][i];         int l=st[u],r=ed[u];         if(s[root[r]]-s[root[l-1]]<k)printf("-1\n"),last=-1;         else query(root[l-1],root[r],1,X.size(),k);     }     return 0; }
   |