如题,线段树M了十几发test35,换了树状数组后同数组大小过了,再调了几发还是M,终究道心破碎,挂个几个月看看有没有神救救。
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
#define pii pair<int, int>
using namespace std;
const int MAX = 5e5 + 8;
long long cnt[MAX << 2];
long long num[MAX];
vector<int> ed[MAX], to[MAX];
int fir[MAX];
int x[MAX];
//void build(int l, int r, int p) {
// cnt[p] = 0;
// if(l == r) {
// return ;
// }
// int mid = l + r >> 1;
// build(l, mid, p * 2);
// build(mid + 1, r, p * 2 + 1);
//}
void fix(int l, int r, int s, int t, int p, int k) {
if(s <= l && r <= t) {
cnt[p] += k;
return ;
}
int mid = l + r >> 1;
if(s <= mid) fix(l, mid, s, t, p * 2, k);
if(mid < t) fix(mid + 1, r, s, t, p * 2 + 1, k);
cnt[p] = cnt[p * 2] + cnt[p * 2 + 1];
}
long long query(int l, int r, int s, int t, int p) {
if(s <= l && r <= t) {
return cnt[p];
}
long long mid = l + r >> 1, ans = 0;
if(s <= mid) ans += query(l, mid, s, t, p * 2);
if(mid < t) ans += query(mid + 1, r, s, t, p * 2 + 1);
return ans;
}
int q;
void dfs(int now, int pre) {
for(auto t : to[now]) {
int w = x[t];
fix(1, q, t, t, 1, w);
}
for(auto to : ed[now]) {
if(to == pre) continue;
dfs(to, now);
}
if(now == 1) num[now] = query(1, q, 1, q, 1);
else num[now] = query(1, q, fir[now], q, 1);
for(auto t : to[now]) {
int w = x[t];
fix(1, q, t, t, 1, -w);
}
}
void run() {
cin >> q;
// build(1, q, 1);
for(int i = 1; i <= q; i++) {
ed[i].clear();
to[i].clear();
// num[i] = fir[i] = 0;
}
int sz = 1;
for(int i = 1; i <= q; i++) {
int op, u;
cin >> op >> u;
if(op == 1) {
sz++;
fir[sz] = i;
ed[u].push_back(sz);
}
else {
int p;
cin >> p;
to[u].push_back(i);
x[i] = p;
}
}
dfs(1, 0);
for(int i = 1; i <= sz; i++) {
cout << num[i] << ' ';
}
cout << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
cin >> t;
while(t--) {
run();
}
return 0;
}