全都RE了求助
查看原帖
全都RE了求助
373905
HappyJaPhy楼主2023/12/1 18:55
#include <bits/stdc++.h>
#define int long long
#define id(x) (lower_bound(h + 1, h + 1 + hn, x) - h)
#define N 100005
using namespace std;
int n, m, v[N], fa[N][20], dep[N], root[N], h[N], hn, cnt;
int head[N], to[N << 1], nxt[N << 1], tot;

struct node {
	int l, r, sum;
} tre[N << 6];

inline void read(int &x) {
	char ch = x = 0;
	int m = 1;
	while (ch < '0' || ch > '9') {
		ch = getchar();
		if (ch == '-') m *= -1;
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + ch - 48;
		ch = getchar();
	}
	x *= m;
	return ;
}

inline void print(int x) {
	if (x < 0) putchar('-'), x = -x;
	static int stk[50];
	int top = 0;
	do {
		stk[top++] = x % 10;
		x /= 10;
	} while (x);
	while (top) {
		putchar(stk[--top] + 48);
	}
	putchar('\n');
	return ;
}

inline void add(int u, int v) {
	to[tot] = v;
	nxt[tot] = head[u];
	head[u] = tot++;
	return ;
}

inline void pushup(int rt) {
	int l = tre[rt].l, r = tre[rt].r;
	tre[rt].sum = tre[l].sum + tre[r].sum;
	return ;
}

void insert(int &nowrt, int rt, int l, int r, int x) {
	nowrt = ++cnt;
	tre[nowrt] = tre[rt];
	if (l == r) {
		tre[nowrt].sum++;
		return ;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) insert(tre[nowrt].l, tre[rt].l, l, mid, x);
	else insert(tre[nowrt].r, tre[rt].r, mid + 1, r, x);
	pushup(nowrt);
	return ;
}

inline void init() {
	for (int l = 1; l < 20; l++) {
		for (int i = 1; i <= n; i++) {
			fa[i][l] = fa[fa[i][l - 1]][l - 1];
		}
	}
	return ;
}

void dfs(int x) {
	int pos = id(v[x]);
	insert(root[x], root[fa[x][0]], 1, hn, pos);
	int v;
	for (int i = head[x]; ~i; i = nxt[i]) {
		v = to[i];
		if (v == fa[x][0]) continue;
		fa[v][0] = x;
		dep[v] = dep[x] + 1;
		dfs(v);
	}
	return ;
}

inline int LCA(int u, int v) {
	if (dep[u] < dep[v]) {
		u ^= v ^= u ^= v;
	}
	int l = 19;
	while (l--) {
		if (dep[fa[u][l]] >= dep[v]) u = fa[u][l];
	}
	if (u == v) return u;
	l = 19;
	while (l--) {
		if (fa[u][l] != fa[v][l]) {
			u = fa[u][l];
			v = fa[v][l];
		}
	}
	return fa[u][0];
}

int query(int rt1, int rt2, int rt3, int rt4, int l, int r, int k) {
	if (l == r) {
		return h[l];
	}
	int mid = (l + r) >> 1;
	int l1 = tre[rt1].l, l2 = tre[rt2].l;
	int l3 = tre[rt3].l, l4 = tre[rt4].l;
	int r1 = tre[rt1].r, r2 = tre[rt2].r;
	int r3 = tre[rt3].r, r4 = tre[rt4].r;
	int lsum = tre[l1].sum + tre[l2].sum - tre[l3].sum - tre[l4].sum;
	if (k <= lsum) {
		return query(l1, l2, l3, l4, l, mid, k);
	} else {
		return query(r1, r2, r3, r4, mid + 1, r, k - lsum);
	}
}

signed main() {
	memset(head, -1, sizeof head);
	read(n), read(m);
	for (int i = 1; i <= n; i++) {
		read(v[i]);
		h[i] = v[i];
	}
	sort(h + 1, h + 1 + n);
	hn = unique(h + 1, h + 1 + n) - h - 1;
	int u, v, k, lca, lstans = 0;
	for (int i = 1; i < n; i++) {
		read(u), read(v);
		add(u, v), add(v, u);
	}
	dfs(1);
	init();
	for (int i = 1; i <= m; i++) {
		read(u), read(v), read(k);
		u ^= lstans;
		lca = LCA(u, v);
		lstans = query(root[u], root[v], root[lca], root[fa[lca][0]], 1, hn, k);
		print(lstans);
	}
	return 0;
}
2023/12/1 18:55
加载中...