代码如下:
#include<bits/stdc++.h>
#define lson pos<<1
#define rson pos<<1|1
#define ll long long
using namespace std;
const int maxn=2e5+10;
int n,m,t;
struct qst{
int u,v,w;
};
struct node{
int frontmx,frontmn,backmx,backmn,mx,mn,sum;
node(){
frontmx=frontmn=backmx=backmn=mx=mn=sum=0;
}
node operator +(const node &t) const{
node res;
res.frontmx=max(frontmx,sum+t.frontmx);
res.frontmn=min(frontmn,sum+t.frontmn);
res.backmx=max(t.sum+backmx,t.backmx);
res.backmn=min(t.sum+backmn,t.backmn);
res.mx=max(mx,max(t.mx,t.frontmx+backmx));
res.mn=min(mn,min(t.mn,t.frontmn+backmn));
res.sum=sum+t.sum;
return res;
}
node rev(){
node ans = *this;
swap(ans.frontmx,ans.backmx);
swap(ans.frontmx,ans.backmn);
return ans;
}
};
int main(){
scanf("%d",&t);
while(t--){
vector< pair<int,int> > q;
vector<qst> p;
q.push_back(make_pair(-1,1));
scanf("%d",&n);
int tot=1;
for(int i=1;i<=n;i++){
char c[10];
scanf("%s",c+1);
if(c[1]=='+'){
int x,y;
scanf("%d%d",&x,&y);
x--;
q.push_back(make_pair(x,y));
tot++;
}
else{
int u,v,x;
scanf("%d%d%d",&u,&v,&x);
u--;
v--;
p.push_back((qst){u,v,x});
}
}
int upbound=__lg(tot);
vector fa(upbound+1,vector<int>(n,-1));
vector f(upbound+1,vector<node>(n));
vector <int> dep(n);
for(int i=0;i<tot;i++){
int x=q[i].first;
if(i) dep[i]=dep[x]+1;
fa[0][i]=x;
if(q[i].second==1) f[0][i].mx=f[0][i].frontmx=f[0][i].backmx=f[0][i].sum=1;
else f[0][i].mn=f[0][i].frontmn=f[0][i].backmn=f[0][i].sum=-1;
for(int j=0;(1<<(j+1))<=dep[i]+1;j++){
fa[j+1][i]=fa[j][fa[j][i]];
f[j+1][i]=f[j][i]+f[j][fa[j][i]];
}
}
auto lca=[&](int x,int y){
if(dep[x]<dep[y]) swap(x,y);
node l,r;
int upbound1=log2(tot);
for(int i=upbound1;i>=0;i--){
if(dep[x]-dep[y]>=(1<<i)){
l=l+f[i][x];
x=fa[i][x];
}
}
if(x==y){
return l+f[0][x];
}
for(int i=upbound1;i>=0;i--){
if(fa[i][x]!=fa[i][y]){
l=l+f[i][x];
r=r+f[i][y];
x=fa[i][x];
y=fa[i][y];
}
}
return l+f[1][x]+f[0][y]+r.rev();
};
int siz=p.size();
for(int i=0;i<siz;i++){
int u=p[i].u;
int v=p[i].v;
int k=p[i].w;
auto ans=lca(u,v);
//cout<<ans.mn<<" "<<ans.mx<<endl;
if(k>=ans.mn&&k<=ans.mx){
printf("YES\n");
}
else printf("NO\n");
}
}
}