哪位大佬能来帮忙看一下QAQ,疯狂re,离散化也换了好几个了,死活调不出来
#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
const int N = 1e6 + 5;
struct line_tree {
int l, r, val;
} t[N << 5];
struct node {
int pre, to;
} g[N << 2];
int n, m, cnt, num, lastans, top;
int val[N], d[N], fa[N], dfn[N], rk[N], f[N][41], root[N], pr[N], b[N];
void ini() {
std :: sort(b + 1, b + 1 + n);
for(int i = 1; i <= n; ++i)
if(b[i] != b[i - 1]) b[++top] = b[i];
return ;
}
int getid(int val) {
int l = 1, r = top, mid, ans;
while(l <= r) {
int mid = (l + r) >> 1;
if(b[mid] == val) return mid;
if(b[mid] > val) r = mid - 1;
else l = mid + 1;
}
}
int ins(int x, int l, int r, int now, int old, int val) {
if(!now) now = ++num;
t[now] = t[old];
t[now].val += 1;
if(l == r) return now;
int mid = (l + r) >> 1;
if(mid >= x) t[now].l = ins(x, l, mid, t[now].l, t[old].l, val);
else t[now].r = ins(x, mid + 1, r, t[now].r, t[old].r, val);
return now;
}
void dfs(int u, int dep) {
root[u] = ins(val[u], 1, n, root[u], root[fa[u]], 1);
d[u] = dep;
for(int i = pr[u]; i; i = g[i].pre) {
int p = g[i].to;
if(p == fa[u]) continue;
fa[p] = u;
dfs(p, dep + 1);
}
return ;
}
void st() {
for(int i = 1; i <= n; ++i)
f[i][0] = fa[i];
for(int j = 1; j <= 31; ++j)
for(int i = 1; i <= n; ++i)
f[i][j] = f[f[i][j - 1]][j - 1];
return ;
}
int lca(int x, int y) {
if(d[x] < d[y]) std :: swap(x, y);
for(int i = 40; i >= 0; --i) {
if(d[x] - (1ll << i) >= d[y])
x = f[x][i];
}
if(x == y) return x;
for(int i = 40; i >= 0; --i) {
if(f[x][i] != f[y][i]) {
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
void add(int fa, int child) {
g[++cnt].pre = pr[fa];
g[cnt].to = child;
pr[fa] = cnt;
return ;
}
int Que(int l, int r, int a, int b, int c, int d, int k) {
if(l == r) return l;
int mid = (l + r) >> 1;
int s = t[t[a].l].val + t[t[b].l].val - t[t[c].l].val - t[t[d].l].val;
if(s >= k) return Que(l, mid, t[a].l, t[b].l, t[c].l, t[d].l, k);
else return Que(mid + 1, r, t[a].r, t[b].r, t[c].r, t[d].r, k - s);
}
signed main() {
std :: ios :: sync_with_stdio(false);
std :: cin >> n >> m;
for(int i = 1; i <= n; ++i)
std :: cin >> val[i], b[i] = val[i];
ini();
for(int i = 1; i <= n; ++i)
val[i] = getid(val[i]);
int x, y, k;
for(int i = 1; i <= n - 1; ++i) {
std :: cin >> x >> y;
add(x, y), add(y, x);
}
dfs(1, 1);
st();
for(int i = 1; i <= m; ++i) {
std :: cin >> x >> y >> k;
x ^= lastans;
int t = lca(x, y);
lastans = b[Que(1, n, root[x], root[y], root[t], root[fa[t]], k)];
std :: cout << lastans << '\n';
}
return 0;
}
果然紫题得紫