提交记录:这里
代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<queue>
#include<deque>
#include<cstring>
#include<string>
#include<set>
#include<utility>
#include<set>
#include<map>
#include<climits>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<random>
#include<ctime>
constexpr int N=5e5,M=5e5;
#define I using
#define AK namespace
#define IOI std
I AK IOI;
int n,m,q;
long long in[N+5];
long long cw[N+5],w[N+5],fll,now;//in为原图入度权和,cw为每个节点入度,w为当前入度和,fll为所有入度为一是权和,now为当前权和
void inline init()
{
static default_random_engine e;
constexpr long long mod=11451419;
e.seed(time(nullptr));
for(int i=1;i<=n;i++)
{
cw[i]=e()%mod+3;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
init();
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
w[v]+=cw[u];in[v]=w[i];
}
now=accumulate(w+1,w+n+1,0ll);
fll=accumulate(cw+1,cw+n+1,0ll);
cin>>q;
while(q--)
{
int op;cin>>op;
switch (op)
{
case 1:
{
int u,v;
cin>>u>>v;
w[v]-=cw[u];
now-=cw[u];
break;
}
case 2:
{
int u;
cin>>u;
now-=w[u];
w[u]=0;
break;
}
case 3:
{
int u,v;
cin>>u>>v;
w[v]+=cw[u];
now+=cw[u];
break;
}
case 4:
{
int u;
cin>>u;
now=now-w[u]+in[u];
w[u]=in[u];
break;
}
default:
break;
}
if(now==fll) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}