除了#6全RE求助
查看原帖
除了#6全RE求助
716260
SegmentTree_楼主2024/3/24 10:51
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sum(x) tr[x].sum
#define ls(x) (tr[x].lc)
#define rs(x) (tr[x].rc)
#define lazy(x) (tr[x].lazy)
const int N = 1e5+5;
struct node{
	int lc, rc;
	int sum;
}tr[N * 100];
int cnt;
int n, q, len;
int root[N];
int dfn[N], cnt1;
int a[N];
int b[N];
int anc[N][20], d[N];
vector<int> mp[N];
int last;
void init(){
	for (int j = 1;j <= 18;j++){
		for (int i = 1;i <= n;i++) anc[i][j] = anc[anc[i][j - 1]][j - 1];
	}
}
int LCA(int u, int v){
	if (d[u] < d[v]) swap(u, v);
	for (int i = 18;i >= 0;i--){
		if (d[anc[u][i]] >= d[v]) u = anc[u][i];
	}
	if (u == v) return u;
	for (int i = 18;i >= 0;i--){
		if (anc[u][i] != anc[v][i]) u = anc[u][i], v = anc[v][i];
	}
	return anc[u][0];
}
void build(int &k, int l, int r){
	k = ++cnt;			
	if (l == r){
		sum(k) = 0;
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(k), l, mid);
	build(rs(k), mid + 1, r);
}
void modify(int &k, int pre, int l, int r, int pos){
	k = ++cnt;
	sum(k) = sum(pre); //
	ls(k) = ls(pre);
	rs(k) = rs(pre);
	if (l == r){
		sum(k)++;
		return;
	}	
	int mid = (l + r) >> 1;
	if (pos <= mid) modify(ls(k), ls(pre), l, mid, pos);
	else modify(rs(k), rs(pre), mid + 1, r, pos);
	sum(k) = sum(ls(k)) + sum(rs(k)); //
}
void dfs(int u, int fa){
	dfn[u] = ++cnt1;
	modify(root[cnt1], root[dfn[fa]], 1, len, lower_bound(b + 1, b + 1 + len, a[cnt1]) - b);
	for (int i = 0;i < mp[u].size();i++){
		int v = mp[u][i];
		if (v == fa) continue;
		anc[v][0] = u;
		d[v] = d[u] + 1;
		dfs(v, u);
	}
}
int query(int u, int v, int lca, int lcaf, int l, int r, int k){
	if (l >= r) return l;
	int x = sum(ls(u)) + sum(ls(v)) - sum(ls(lca)) - sum(ls(lcaf));
	int mid = (l + r) >> 1;
	if (x >= k) return query(ls(u), ls(v), ls(lca), ls(lcaf), l, mid, k);
	else return query(rs(u), rs(v), rs(lca), rs(lcaf), mid + 1, r, k - x);
}
int main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> q;
	for (int i = 1;i <= n;i++){
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b + 1, b + 1 + n);
	len = unique(b + 1, b + 1 + n) - b - 1;
	for (int i = 1;i < n;i++){
		int u, v;
		cin >> u >> v;
		mp[u].push_back(v);
		mp[v].push_back(u);
	}	
	build(root[0], 1, len);
	d[1] = 1;
	dfs(1, 0);
	init();	
	while (q--){
		int u, v, k;
		cin >> u >> v >> k;
		u ^= last;
		int lca = LCA(u, v);
		last = b[query(root[dfn[u]], root[dfn[v]], root[dfn[lca]], root[dfn[anc[lca][0]]], 1, len, k)];
		cout << last << '\n';
	}
	return 0;
} 
2024/3/24 10:51
加载中...