文件详细信息
本文件的大小为 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;
}