#P7310. [2019年3月福建]农民

[2019年3月福建]农民

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
	int x;char c;
	while((c=getchar())<'0'||c>'9');
	for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=x*10+c-'0';
	return x;
}
#define MN 100000
#define L (k<<1)
#define R (k<<1|1)
#define up(k) t[k].x=t[L].x+t[R].x
struct dataa{int lmx,lmn,rmx,rmn;};
inline int mx(int a,int b){return a<0?b:b<0?a:max(a,b);}
inline int mn(int a,int b){return a<0?b:b<0?a:min(a,b);}
dataa operator+(const dataa&a,const dataa&b)
{
	return (dataa){mx(a.lmx,b.lmx),mn(a.lmn,b.lmn),
				  mx(a.rmx,b.rmx),mn(a.rmn,b.rmn)};
}
dataa operator~(const dataa&a)
{
	return (dataa){a.rmx,a.rmn,a.lmx,a.lmn};
}
struct node{int l,r,rv;dataa x;}t[MN*4+5];
int v[MN+5],lc[MN+5],rc[MN+5],s[MN+5],fa[MN+5];
int f[MN+5],l[MN+5],r[MN+5],p[MN+5],cnt;
void dfs(int x)
{
	fa[lc[x]]=fa[rc[x]]=x;
	if(lc[x])dfs(lc[x]);if(rc[x])dfs(rc[x]);
	s[x]=s[lc[x]]+s[rc[x]]+1;
}
void build(int x)
{
	p[l[x]=++cnt]=x;
	if(!f[x])f[x]=x;
	if(s[lc[x]]>s[rc[x]])
	{
		f[lc[x]]=f[x];build(lc[x]);
		if(rc[x])build(rc[x]);
	}
	else if(rc[x])
	{
		f[rc[x]]=f[x];build(rc[x]);
		if(lc[x])build(lc[x]);
	}
	r[x]=cnt;
}
void build(int k,int l,int r)
{
	if((t[k].l=l)==(t[k].r=r))
	{
		if((l=p[l])==1)t[k].x=(dataa){-1,-1,-1,-1};
		else if(lc[fa[l]]==l)t[k].x=(dataa){-1,-1,v[fa[l]],v[fa[l]]};
		else t[k].x=(dataa){v[fa[l]],v[fa[l]],-1,-1};
		return;
	}
	int mid=l+r>>1;
	build(L,l,mid);build(R,mid+1,r);up(k);
}
inline void rev(int k){t[k].x=~t[k].x;t[k].rv^=1;}
inline void down(int k){if(t[k].rv)rev(L),rev(R),t[k].rv=0;}
void rev(int k,int l,int r)
{
	if(t[k].l==l&&t[k].r==r){rev(k);return;}
	int mid=t[k].l+t[k].r>>1;down(k);
	if(r<=mid)rev(L,l,r);
	else if(l>mid)rev(R,l,r);
	else rev(L,l,mid),rev(R,mid+1,r);
	up(k);
}
void renew(int k,int x)
{
	if(t[k].l==t[k].r)
	{
		x=p[x];
		if((lc[fa[x]]==x)^t[k].rv)t[k].x=(dataa){-1,-1,v[fa[x]],v[fa[x]]};
		else t[k].x=(dataa){v[fa[x]],v[fa[x]],-1,-1};
		return;
	}
	down(k);renew(x>t[k].l+t[k].r>>1?R:L,x);up(k);
}
dataa query(int k,int l,int r)
{
	if(t[k].l==l&&t[k].r==r)return t[k].x;
	int mid=t[k].l+t[k].r>>1;down(k);
	if(r<=mid)return query(L,l,r);
	if(l>mid)return query(R,l,r);
	return query(L,l,mid)+query(R,mid+1,r);
}
int main()
{
	int n,m,i,x;
	n=read();m=read();
	for(i=1;i<=n;++i)v[i]=read(),lc[i]=read(),rc[i]=read();
	dfs(1);build(1);
	build(1,1,n);
	while(m--)
	{
		i=read();x=read();
		if(i==1)
		{
			v[x]=read();
			if(lc[x])renew(1,l[lc[x]]);
			if(rc[x])renew(1,l[rc[x]]);
		}
		if(i==2)if(l[x]<r[x])rev(1,l[x]+1,r[x]);
		if(i==3)
		{
			dataa d=(dataa){0,0,1e9+1,1e9+1};
			for(i=x;i;i=fa[f[i]])d=d+query(1,l[f[i]],l[i]);
			puts(v[x]>d.lmx&&v[x]<d.rmn?"YES":"NO");
		}
	}
}