rt,调了一晚上了复杂度应该是对的。不知道哪里出问题了/kel
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cassert>
#include<queue>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define lc(p) (p<<1)
#define rc(p) ((p<<1)|1)
#define klc(p) (tr[p].l)
#define krc(p) (tr[p].r)
using namespace std;
//================================
int T;int w[200005];
vector<int>tr[200005];
int dpmax[200005],dpmin[200005];
int V[200005],K[200005];
void dfs(int u,int fa,int mx,int mn){
dpmax[u]=max(mx+w[u],0);
dpmin[u]=min(mn+w[u],0);
mx=dpmax[u];mn=dpmin[u];
if(fa!=0)
dpmax[u]=max(dpmax[u],dpmax[fa]);
dpmin[u]=min(dpmin[u],dpmin[fa]);
for(int i:tr[u]){
if(i!=fa){
dfs(i,u,mx,mn);
}
}
}
signed main(){
#ifdef LOCAL
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
//================================
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--){
tr[0].pb(1);w[1]=1;
int idx=1;
int n;cin>>n;
int now=0;
while(n--){
char p;cin>>p;
if(p=='+'){
int v,x;cin>>v>>x;
tr[v].pb(++idx);
w[idx]=x;
}
else{
int u,v,k;
cin>>u>>v>>k;
V[++now]=v;K[now]=k;
}
}
dfs(1,0,0,0);
for(int i=1;i<=now;i++){
if(K[i]>=dpmin[V[i]]&&K[i]<=dpmax[V[i]])cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
for(int i=1;i<=n;i++)tr[i].clear();
memset(dpmax,0,sizeof(dpmax));
memset(dpmin,0,sizeof(dpmin));
}
//================================
return 0;
}