0pts 样例过了 hack没过
查看原帖
0pts 样例过了 hack没过
125375
Goliard楼主2023/10/26 11:49
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N=1e6+5;
ll last;
int n, m, q, a[N], c[N], nn;
int hea[N], tot, f[N][25];
int fa[N], cnt, val[N];
int rt[N];
int dfn[N], L[N], R[N], dfs_clock;
struct Line { int s, t, w; }e[N];
struct Edge { int v, nt; }ed[N];

struct SegmentTree {
    int tot;
    struct Tree {
        int cnt, ls, rs;
    }tr[N<<5];
    int Build(int l,int r) {
		int p=++tot;
		if(l==r) return p;
		int mid=(l+r)>>1;
		tr[p].cnt=0;
		tr[p].ls=Build(l, mid);
		tr[p].rs=Build(mid+1, r);
		return p;
	}
	
    int Add(int o, int l, int r, int k) {
    	if(!k) return o;
    	int p=++tot;
    	tr[p]=tr[o]; tr[p].cnt++;
    	if(l==r) return p;
    	int mid=(l+r)>>1;
    	if(k<=mid) tr[p].ls=Add(tr[p].ls, l, mid, k);
    	else tr[p].rs=Add(tr[p].rs, mid+1, r, k);
    	return p;
	}
	
	int Ask(int o1, int o2, int l, int r, int k) {
		if(!k) return 0;
		if(tr[o2].cnt-tr[o1].cnt<k) return 0; 
		int mid=(l+r)>>1, x=tr[tr[o2].rs].cnt-tr[tr[o1].rs].cnt;
		if(l==r) return l;
		if(x<k) return Ask(tr[o1].ls, tr[o2].ls, l, mid, k-x);
		return Ask(tr[o1].rs, tr[o2].rs, mid+1, r, k);
	}
}dis;

inline ll read() {
    ll x=0,fl=1; register char ch=getchar();
    for( ; !isdigit(ch); fl=ch=='-'?-1:1, ch=getchar());
    for( ; isdigit(ch); x=(x<<3)+(x<<1)+(ch^48), ch=getchar());
    return fl==1?x:-x;
}

void dfs(int u, int fat) {
	f[u][0]=fat;
	L[u]=++dfs_clock; dfn[dfs_clock]=u;
	for(int i=1; i<=25; ++i) f[u][i]=f[f[u][i-1]][i-1];
	for(int i=hea[u]; i; i=ed[i].nt) {
		int v=ed[i].v;
		if(v==fat) continue;
		dfs(v, u);
	}
	R[u]=dfs_clock;
}

int get(int x) { return fa[x]==x?x:fa[x]=get(fa[x]); }

void add(int u, int v) { ed[++tot]={v, hea[u]}; hea[u]=tot; }

void kruskal() {
	iota(fa+1, fa+2*n+1, 1); cnt=n;
	sort(e+1, e+m+1, [=](const Line &x, const Line &y){ return x.w<y.w; });
	
	for(int i=1, fx=0, fy=0; i<=m; ++i) {
		fx=get(e[i].s), fy=get(e[i].t);
		if(fx==fy) continue;
		val[++cnt]=e[i].w;
		fa[fx]=fa[fy]=cnt;
		add(cnt, fx), add(cnt, fy);
	}
}

int main() {
//    freopen(".in", "r", stdin);
//    freopen(".out", "w", stdout);
	n=read();
	m=read();
	q=read();
	for(int i=1; i<=n; ++i) a[i]=read(), c[++nn]=a[i];
	for(int i=1; i<=m; ++i)
		e[i].s=read(), e[i].t=read(), e[i].w=read();

	sort(c+1, c+nn+1);
	nn=unique(c+1, c+nn+1)-c-1;

	kruskal();
	for(int i=1; i<=cnt; ++i) if(fa[i]==i) dfs(i, 0);
	
	for(int i=1; i<=n; ++i) a[i]=lower_bound(c+1, c+nn+1, a[i])-c;
	rt[0]=dis.Build(1, nn);
	for(int i=1; i<=cnt; ++i) rt[i]=dis.Add(rt[i-1], 1, nn, a[dfn[i]]);
	
	val[0]=1e9;
	while(q--) {
		ll u=(read()^last)%n+1, x=read()^last, k=(read()^last)%n+1;
        for(int i=25; ~i; --i) if(f[u][i] && val[f[u][i]]<=x) u=f[u][i];
        last=c[dis.Ask(rt[L[u]-1], rt[R[u]], 1, nn, k)];
        if(!last) puts("-1");
        else printf("%lld\n", last);
	}
    return 0;
}
2023/10/26 11:49
加载中...