提交时间:2024-10-02 16:05:32
运行 ID: 32955
#include<bits/stdc++.h> //#define int long long using namespace std; const int maxn=2e3+7; const int LB=12; int n,m,q,tp; vector<int> E[maxn]; int U[maxn<<2]; int V[maxn<<2]; int F[maxn][maxn][LB]; bool vis[maxn]; void DFS(int u){ // cout<<u<<endl; vis[u]=1; for(auto v:E[u])if(!vis[v])DFS(v); }//求出所有可以到达 t 的点 void Set(int ST[maxn][LB],int t){ for(int i=1;i<=n+1;i++)ST[i][0]=n+1; for(int i=1;i<=m;i++)if(vis[U[i]]&&vis[V[i]])ST[U[i]][0]=min(ST[U[i]][0],V[i]); ST[t][0]=n+1; for(int j=1;j<LB;j++)for(int i=1;i<=n+1;i++)ST[i][j]=ST[ST[i][j-1]][j-1]; }//预处理 signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m>>q>>tp; for(int i=1;i<=m;i++)cin>>U[i]>>V[i],E[V[i]].push_back(U[i]); for(int t=1;t<=n;t++){ for(int i=1;i<=n;i++)vis[i]=0; DFS(t);Set(F[t],t); // cout<<"! "<<t<<endl; } int lst=1; while(q--){ int s,t,k; cin>>s>>t>>k; if(tp)s=(s^lst)%n+1,t=(t^lst)%n+1,k=(k^lst)%n+1; // cout<<s<<" "<<t<<" "<<k<<endl; if(F[t][s][0]>n){ //不可达 // cerr<<"INACCESSABLE"<<endl; lst=1,cout<<-lst<<endl; continue; } if(F[t][F[t][s][LB-1]][LB-1]<=n){ //进环 // cerr<<"CYCLE"<<endl; lst=1,cout<<-lst<<endl; continue; } k--; for(int i=LB-1;i>=0;i--)if(k&(1<<i))s=F[t][s][i]; if(s>n){ // cerr<<"THE LENGTH OF THE PATH IS NOT ENOUGH"<<endl; lst=1,cout<<-lst<<endl; continue; } lst=s; cout<<lst<<endl; } }