rt,感觉先解决 RE 会好弄一点。思路跟题解区基本一致。
#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int in()
{
int k=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
void out(int x)
{
if(x<0)putchar('-'),x=-x;
if(x<10)putchar(x+'0');
else out(x/10),putchar(x%10+'0');
}
const int N=1e5+10,L=910;
struct que{int op,x,y;}ask[N];
int n,u[N],v[N];
bool ans[N];
bool cant[N];
namespace ksrj
{
vector<pair<int,int>>e[N],e2[N];
void add(int u,int v,int id){e[u].push_back({v,id});e2[v].push_back({u,id});}
bool vis[N];
vector<int>s;
int cnt,num[N];
void dfs1(int u)
{
vis[u]=true;
for(auto [v,id]:e[u])if(!vis[v]&&!cant[id])dfs1(v);
s.push_back(u);
}
void dfs2(int u)
{
num[u]=cnt;
for(auto [v,id]:e2[u])if(!num[v]&&!cant[id])dfs2(v);
}
void kosaraju()
{
s.clear(),cnt=0;for(int i=1;i<=n;i++)num[i]=vis[i]=0;
for(int i=1;i<=n;i++)if(!vis[i])dfs1(i);
for(int i=n-1;i>=0;i--)if(!num[s[i]])cnt++,dfs2(s[i]);
}
}
int S[N];
vector<int>G[N];int en[N];
bitset<L>f[N];
void toposort(int len)
{
queue<int>q;
for(int i=1;i<=len;i++)if(!en[i])q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
for(int v:G[u])
{
f[v]|=f[u];
if(!(--en[v]))q.push(v);
}
}
}
int ID[N];
bitset<L>g[N];
int color[N];
bool bfs(int s,int t)
{
if(s==t)return 1;
bitset<L>now;now.set();
queue<int>q;q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
bitset<L>tmp=(now&(f[u]|g[u]));
for(int v=tmp._Find_first();v<L;v=tmp._Find_next(v))
{
if(v==t)return 1;
q.push(v),now.reset(v);
}
}
return 0;
}
void clear(int l,int r,int len)
{
for(int i=l;i<=r;i++)if(ask[i].op==1)cant[ask[i].x]=0;
for(int i=1;i<=len;i++)G[i].clear(),en[i]=0;
for(int i=1;i<=len;i++)f[i].reset(),g[i].reset(),ID[i]=0,S[i]=0;
}
void solve(int l,int r)
{
for(int i=l;i<=r;i++)if(ask[i].op==1)cant[ask[i].x]=1;
ksrj::kosaraju();
int len=0;
for(int i=1;i<=r;i++)
if(ask[i].op==1)S[++len]=ksrj::num[u[ask[i].x]],S[++len]=ksrj::num[v[ask[i].x]];
else S[++len]=ksrj::num[ask[i].x],S[++len]=ksrj::num[ask[i].y];
sort(S+1,S+len+1),len=unique(S+1,S+len+1)-S-1;
for(int i=1;i<=len;i++)ID[S[i]]=i,f[i].set(i);
for(int u=1;u<=n;u++)
for(auto [v,id]:ksrj::e[u])
{
if(cant[id]||ksrj::num[u]==ksrj::num[v])continue;
G[ID[ksrj::num[v]]].push_back(ID[ksrj::num[u]]),en[ID[ksrj::num[u]]]++;
}
toposort(len);
for(int i=l;i<=r;i++)
{
if(!(ask[i].op==1&&color[i]))continue;
int U=ID[ksrj::num[u[ask[i].x]]];
int V=ID[ksrj::num[v[ask[i].x]]];
g[U].set(V);
}
for(int i=l;i<=r;i++)
if(ask[i].op==1)
{
color[ask[i].x]^=1;
int U=ID[ksrj::num[u[ask[i].x]]];
int V=ID[ksrj::num[v[ask[i].x]]];
if(!color[ask[i].x])g[U].reset(V);
else g[U].set(V);
}
else ans[i]=bfs(ID[ksrj::num[ask[i].x]],ID[ksrj::num[ask[i].y]]);
clear(l,r,len);
}
int main()
{
n=in();int m=in(),q=in();
for(int i=1;i<=m;i++)color[i]=1,u[i]=in(),v[i]=in(),ksrj::add(u[i],v[i],i);
for(int i=1;i<=q;i++)
{
ask[i].op=in();
if(ask[i].op==1)ask[i].x=in();
else ask[i].x=in(),ask[i].y=in();
}
const int B=225;
for(int i=1;i<=q;i+=B)solve(i,min(q,i+B-1));
for(int i=1;i<=q;i++)if(ask[i].op==2)puts(ans[i]==1?"YES":"NO");
return 0;
}