找到了re出现的位置(也可能是其他地方出现的问题),但是不懂为什么会出现这样的情况,在下面代码中进行了说明,请大佬解释一下原因。
#include<bits/stdc++.h>
#define int long long
#define debug(x) cout<<"LINE"<<__LINE__<<":"<<#x<<"="<<x<<endl;
using namespace std;
typedef long long ll;
struct Trie_01{
int re = 0;
int cnt = 0;
int maxx = 0;
vector<vector<int>> ch;
vector<int> w;
vector<int> xorv;
Trie_01() {};
Trie_01(int n) {
ini(n);
};
void ini(int n) {
cnt = 0;
maxx = 25;
ch.resize(2);
for(int i = 0; i < 2; ++i) {
ch[i].resize((n + 1) * maxx);
}
re = (n + 1) * maxx;
w.resize((n + 1) * maxx);
xorv.resize((n + 1) * maxx);
}
void maintain(int inx) {
w[inx] = xorv[inx] = 0;
if(ch[0][inx]) {
w[inx] += w[ch[0][inx]];
xorv[inx] ^= (xorv[ch[0][inx]] << 1);
}
if(ch[1][inx]) {
w[inx] += w[ch[1][inx]];
xorv[inx] ^= (xorv[ch[1][inx]] << 1 | (w[ch[1][inx]] & 1));
}
}
void ins(int &inx, int x, int dep) {
if(!inx) inx = ++cnt; //问题应该是出在这里,cnt加到超过了maxx * (n + 1)的值。
//我对于每一个数设置的深度为20,超过就return了,
//但在上面resize的时候每一个数分配了25的大小,空间应该是足够的
//不清楚为什么会超过maxx*(n + 1)的大小。
if(dep > 20) {
w[inx]++;
return ;
}
ins(ch[x & 1][inx], x >> 1, dep + 1);
maintain(inx);
}
void add(int inx) {
if(ch[1][inx]) {
add(ch[1][inx]);
}
swap(ch[1][inx], ch[0][inx]);
maintain(inx);
}
};
void solve() {
int n, m;
cin >> n >> m;
vector<int> val(n + 1);
vector<vector<int>> e(n + 1);
for(int i = 1; i <= n - 1; ++i) {
int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
for(int i = 1; i <= n; ++i) {
cin >> val[i];
}
vector<int> fa(n + 1);
auto dfs = [&](auto self, int u, int f) -> void {
fa[u] = f;
for(auto v : e[u]) {
if(v != f) {
self(self, v, u);
}
}
};
dfs(dfs, 1, -1);
Trie_01 t = Trie_01(n);
vector<int> rt(n + 1);
vector<int> st(n + 1);
for(int i = 1; i <= n; ++i) {
if(fa[i] != -1) {
t.ins(rt[fa[i]], val[i], 0);
}
}
auto cal = [&](int inx) -> int {
return (fa[inx] == -1 ? 0 : st[fa[inx]]) + val[inx];
};
for(int i = 1; i <= m; ++i) {
int type, inx, v;
cin >> type >> inx;
if(type == 1) {
t.add(rt[inx]);
st[inx]++;
if(inx != 1) {
if(fa[fa[inx]] != -1) t.ins(rt[fa[fa[inx]]], cal(fa[inx]), 0);
val[fa[inx]]++;
if(fa[fa[inx]] != -1) t.ins(rt[fa[fa[inx]]], cal(fa[inx]), 0);
}
} else if(type == 2) {
cin >> v;
if(inx != 1) t.ins(rt[fa[inx]], cal(inx), 0);
val[inx] -= v;
if(inx != 1) t.ins(rt[fa[inx]], cal(inx), 0);
} else {
int ans = t.xorv[rt[inx]];
if(fa[inx] != -1) {
ans ^= cal(fa[inx]);
}
cout << ans << '\n';
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int cn = 1;
// cin >> cn;
while(cn--)
solve();
return 0;
}