提交时间:2024-10-02 17:26:00
运行 ID: 33000
#include<bits/stdc++.h> #define PII pair<int,int> #define fi first #define se second using namespace std; const int N=2100,V=5500; int n,m,q,t; vector<int> e[N]; int pre[N][N][15]; int sc[N][N]; bool r[N][N]; stack<int> st; bool vis[N]; inline void dfs(int s,int u,int d,bool fl){ sc[s][u]=d;if(fl) sc[s][u]=-1;vis[u]=1;st.push(u); for(auto ed:e[u]){ if(!vis[ed]&&sc[s][ed]==0) dfs(s,ed,d+1,fl),pre[s][ed][0]=u; else if(vis[ed]){r[s][ed]=1;while(!st.empty()) {int p=st.top();st.pop();r[s][p]=1;vis[p]=0;if(p==ed) break;}assert(ed!=u);} if(r[s][u]) fl=1; }if(!r[s][u]) while(!st.empty()){int p=st.top();st.pop();vis[p]=0;if(p==u) break;};vis[u]=0; } int main(){ scanf("%d%d%d%d",&n,&m,&q,&t); for(int i=1;i<=m;i++){ int u,v;scanf("%d%d",&u,&v);e[u].push_back(v);//e[v].push_back(u); }for(int i=1;i<=n;i++){ sort(e[i].begin(),e[i].end()); }for(int i=1;i<=n;i++) dfs(i,i,1,0); for(int j=1;j<=13;j++){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) pre[k][i][j]=pre[k][pre[k][i][j-1]][j-1]; }int la=1; while(q--){ int u,v,k;scanf("%d%d%d",&u,&v,&k); u^=la*t;v^=la*t;k^=la*t; if(t) u=u%n+1,v=v%n+1,k=k%n+1; if(sc[u][v]<k){ printf("%d\n",-1);la=1; }else{ k=sc[u][v]-k; for(int i=0;i<=13;i++){ if(k&1) v=pre[u][v][i]; k>>=1; }la=v;printf("%d\n",la); } } return 0; }