文件详细信息

下载本文件

本文件的大小为 1419 字节。

#include<cstdio>
#include<set>
void read(int&num){
	int ch=getchar();
	num=0;
	while(ch<48||ch>57)ch=getchar();
	while(ch>=48&&ch<=57)num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
}
typedef unsigned int uint;
typedef unsigned long long ull;
namespace my_rand{
	uint seed=0x35fdba98,trans=13543;
	uint random(){
		return seed*=trans;
	}
};
const int maxn=500005;
int n,m,q;
uint val[maxn];
ull inval[maxn],in_val,out_val;
std::set<int>in[maxn];
bool flag[maxn];
int main(){
	read(n),read(m);
	for(int i=1;i<=n;i++)out_val+=(val[i]=my_rand::random());
	for(int i=1;i<=n;i++)flag[i]=true;
	for(int i=1,u,v;i<=m;i++){
		read(u),read(v);
		inval[v]+=val[u];
	}
	for(int i=1;i<=n;i++)in_val+=inval[i];
	read(q);
	for(int task=1,opt,u,v;task<=q;task++){
		read(opt),read(u);
		if(opt==1){
			read(v);
			if(flag[v])in[v].insert(u);
			else in[v].erase(u);
			in_val-=val[u];
		}else if(opt==2){
			if(flag[u]){
				for(int v:in[u])in_val+=val[v];
				in[u].clear();
				flag[u]=false;
				in_val-=inval[u];
			}else{
				for(int v:in[u])in_val-=val[v];
				in[u].clear();
			}
		}else if(opt==3){
			read(v);
			if(flag[v])in[v].erase(u);
			else in[v].insert(u);
			in_val+=val[u];
		}else{
			if(flag[u]){
				for(int v:in[u])in_val+=val[v];
				in[u].clear();
			}else{
				for(int v:in[u])in_val-=val[v];
				in[u].clear();
				flag[u]=true;
				in_val+=inval[u];
			}
		}
		puts(in_val==out_val?"YES":"NO");
	}
	return 0;
}