主席树过样例,全 RE 求助
查看原帖
主席树过样例,全 RE 求助
304550
black_trees楼主2022/9/25 14:55
// author : black_trees

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

#define endl '\n'

using namespace std;
using i64 = long long;

const int si = 1e5 + 10;

int n, m, len, cnt;
int a[si], id[si];

int head[si << 1];
struct Edge {
	int ver, Next;
}e[si << 1];
void add(int u, int v) {
	e[cnt].ver = v, e[cnt].Next = head[u], head[u] = cnt++;
}

int get_id(int val) {
	return lower_bound(id + 1, id + 1 + len, val) - id;
}

int tot = 0;
int ls[si << 5], rs[si << 5];
int root[si << 5], dat[si << 5];
int build(int l, int r) {
	int p = ++tot;
	if(l == r) return p;
	int mid = (l + r) >> 1;
	ls[p] = build(l, mid), rs[p] = build(mid + 1, r);
	return p;
}
int insert(int last, int l, int r, int v) {
	int p = ++tot;
	dat[p] = dat[last] + 1;
	if(l == r) return p;
	int mid = (l + r) >> 1;
	if(v <= mid) 
		ls[p] = insert(ls[last], l, mid, v), rs[p] = rs[last];
	else 
		rs[p] = insert(rs[last], mid + 1, r, v), ls[p] = ls[last];
	return p;
}
int ask(int p, int q, int u, int v, int l, int r, int kth) {
	if(l == r) return l;
	int mid = (l + r) >> 1;
	int lcnt = dat[ls[p]] + dat[ls[q]] - dat[ls[u]] - dat[ls[v]];
	if(kth <= lcnt) 
		return ask(ls[p], ls[q], ls[u], ls[v], l, mid, kth);
	else 
		return ask(rs[p], rs[q], rs[u], rs[v], mid + 1, r, kth - lcnt); 
}

int dep[si];
int f[si][20];
void dfs(int u, int fa) {
	f[u][0] = fa, dep[u] = dep[fa] + 1;
	for(int i = 1; i <= 20; ++i) 
		f[u][i] = f[f[u][i - 1]][i - 1];
	for(int i = head[u]; ~i; i = e[i].Next) {
		int v = e[i].ver;
		if(v == fa) continue;
		root[v] = insert(root[u], 1, len, get_id(a[v]));
		dfs(v, u);
	}
}
int lca(int u, int v) {
	if(dep[u] < dep[v]) swap(u, v);
	for(int i = 20; i >= 0; --i) 
		if(dep[f[u][i]] >= dep[v]) 
			u = f[u][i];
	if(u == v) return u;
	for(int i = 20; i >= 0; --i) 
		if(f[u][i] != f[v][i])
			u = f[u][i], v = f[v][i];
	return f[u][0];
}

int main() {	

	cin.tie(0) -> sync_with_stdio(false);
	cin.exceptions(cin.failbit | cin.badbit);

	memset(head, -1, sizeof head);

	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		cin >> a[i], id[i] = a[i];
	sort(id + 1, id + 1 + n);
	len = unique(id + 1, id + 1 + n) - id - 1;

	for(int i = 1; i < n; ++i) {
		int u, v; cin >> u >> v;
		add(u, v), add(v, u);
	}

	root[0] = build(1, len);
	root[1] = insert(root[0], 1, len, get_id(a[1]));

	dfs(1, 0);

	int lastans = 0;
	while(m --) {
		int u, v, k;
		cin >> u >> v >> k;
		u ^= lastans;
		int Lca = lca(u, v), Fa = f[Lca][0];
		cout << (lastans = id[ask(root[u], root[v], root[Lca], root[Fa], 1, len, k)]) << endl;
	}

	return 0;
}
2022/9/25 14:55
加载中...