主席树插入时,传入参数 rt[dep[a[i]]] 和 rt[dep[a[i - 1]]] 可能相同,这时应该没必要新开一个节点 u=++tot 吧,但是这样会 WA on test 43,求助大佬,错误代码如下:
#include <bits/stdc++.h>
#define int long long
#define ls(u) nd[u].l
#define rs(u) nd[u].r
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f3f3f3f3f;
int tot, tim, h[N], w[N], fa[N], siz[N], dfn[N], dep[N], a[N], rt[N];
struct edge {
int v, next;
} e[N << 1];
struct SGT {
int tot;
struct node {
int minw, l, r;
} nd[N << 6];
void insert(int& u, int v, int l, int r, int x, int val) {
if(!u){///////////////删掉这两行就AC了
u = ++tot;
nd[u] = nd[v];
}////////////////////
if (nd[u].minw) {
nd[u].minw = min(nd[u].minw, val);
}
else {
nd[u].minw = val;
}
if (l == r) {
return;
}
int mid = (l + r) >> 1;
if (x <= mid) {
insert(ls(u), ls(v), l, mid, x, val);
}
else {
insert(rs(u), rs(v), mid + 1, r, x, val);
}
}
int query(int u, int l, int r, int x, int y) {
if (!u) {
return INF;
}
if (x <= l && r <= y) {
return nd[u].minw;
}
int mid = (l + r) >> 1;
if (y <= mid) {
return query(ls(u), l, mid, x, y);
}
if (x > mid) {
return query(rs(u), mid + 1, r, x, y);
}
return min(query(ls(u), l, mid, x, y), query(rs(u), mid + 1, r, x, y));
}
} sgt;
void add(int u, int v) {
e[++tot] = {v, h[u]};
h[u] = tot;
}
void dfs(int u) {
siz[u] = 1;
dfn[u] = ++tim;
dep[u] = dep[fa[u]] + 1;
for (int i = h[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa[u]) {
continue;
}
fa[v] = u;
dfs(v);
siz[u] += siz[v];
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, root, u, v, m, K;
cin >> n >> root;
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
for (int i = 1; i < n; i++) {
cin >> u >> v;
add(u, v);
add(v, u);
}
dfs(root);
for (int i = 1; i <= n; i++) {
a[i] = i;
}
sort(a + 1, a + n + 1, [](int x, int y) {
return dep[x] < dep[y];
});
for (int i = 1; i <= n; i++) {
sgt.insert(rt[dep[a[i]]], rt[dep[a[i - 1]]], 1, n, dfn[a[i]], w[a[i]]);
}
cin >> m;
int ans = 0;
while (m--) {
cin >> u >> K;
u = (u + ans) % n + 1;
K = (K + ans) % n;
ans = sgt.query(rt[min(dep[u] + K, dep[a[n]])], 1, n, dfn[u], dfn[u] + siz[u] - 1);
cout << ans << endl;
}
return 0;
}