提交时间:2024-10-02 16:14:36
运行 ID: 32959
#include<bits/stdc++.h> #define int short #define i32 signed using namespace std; const int maxn=2e3+7; const int LB=12; void rd(int &x){ x=0;int f=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<2)+(ch^48);ch=getchar();} } int n,m,tp; i32 q; vector<int> E[maxn]; int U[maxn<<2]; int V[maxn<<2]; int F[maxn][maxn][LB]; bool vis[maxn]; inline void DFS(int u){ // cout<<u<<endl; vis[u]=1; for(auto v:E[u])if(!vis[v])DFS(v); }//求出所有可以到达 t 的点 inline 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]; }//预处理 i32 main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); rd(n);rd(m);cin>>q;rd(tp); for(int i=1;i<=m;i++)rd(U[i]),rd(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; rd(s),rd(t),rd(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; } }