提交时间:2024-10-02 16:24:34

运行 ID: 32962

#include<bits/stdc++.h> #define ll long long #define lson pos<<1 #define rson pos<<1|1 using namespace std; const int maxn=2e3+10; const ll mod=98244353; const ll inf=1e9; ll n,m,k,t,ans=1,cnt[maxn],tot=0; ll a[maxn][maxn],b[maxn][maxn],fa[maxn][maxn][20],loop[maxn],vis[maxn],instk[maxn],stk[maxn]; vector<int> q[maxn],edge[maxn]; queue<int> q1; void bfs(int pos){ for(int i=1;i<=n;i++){ vis[i]=0; } q1.push(pos); vis[pos]=1; while(!q1.empty()){ int x=q1.front(); q1.pop(); int siz=edge[x].size(); for(int i=0;i<siz;i++){ int v=edge[x][i]; if(!vis[v]) q1.push(v),vis[v]=1; } } fa[pos][n+1][0]=n+1; for(int i=1;i<=n;i++){ fa[pos][i][0]=n+1; if(i==pos) fa[pos][i][0]=0; int siz=q[i].size(); for(int j=0;j<siz;j++){ ll v=q[i][j]; if(vis[v]) fa[pos][i][0]=min(fa[pos][i][0],v); } } for(int i=0;i<18;i++){ for(int j=1;j<=n+1;j++){ fa[pos][j][i+1]=fa[pos][fa[pos][j][i]][i]; } } } int main(){ // freopen("test.in","r",stdin); // freopen("path.out","w",stdout); memset(fa,0,sizeof(fa)); scanf("%lld%lld%lld%lld",&n,&m,&k,&t); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); q[u].push_back(v); edge[v].push_back(u); } for(int i=1;i<=n;i++){ bfs(i); } while(k--){ ll x,y,z; scanf("%lld%lld%lld",&x,&y,&z); x^=(t*ans); y^=(t*ans); z^=(t*ans); ans=0; z--; for(int i=0;i<=18;i++){ if(z&(1<<i)) x=fa[y][x][i]; // cout<<x<<endl; } ans=x; //cout<<fa[y][x][18]<<endl; if(fa[y][x][18]||x==0||x==n+1) ans=-1; printf("%lld\n",ans); ans=abs(ans); } return 0; }