#pragma comment(linker, "/STACK:60777216") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long double ld; typedef long long ll; typedef pair pii; typedef pair pdd; typedef vector vi; typedef vector vd; typedef pair pl; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define SORT(v) sort((v).begin(),(v).end()) #define UN(v) SORT(v),(v).erase(unique((v).begin(),(v).end()),(v).end()) #define CL(a,b) memset(a,b,sizeof a) #define pb push_back int n,m,s,k; int d[111111]; vi v[111111]; int res[111111][21][2]; bool u[111111][21][2]; void solve(){ CL(res,-1); res[s][1][0]=0; deque q; q.push_back(s*2*21+1*2+0); while(!q.empty()){ int val = q.front(); q.pop_front(); int s = val / 2 / 21; int e = val % (2 * 21) / 2; int a = val % 2; //cout< cval){ res[d[s]][min(e+1,k)][0]=cval; q.push_front(d[s]*21*2+min(e+1,k)*2+0); } // move if(e>0)REP(i,v[s].size()){ if(res[v[s][i]][e-1][1]==-1 || res[v[s][i]][e-1][1] > cval + 1-a){ res[v[s][i]][e-1][1]=cval + 1-a; if(a==1)q.push_front(v[s][i]*21*2+(e-1)*2+1); else q.push_back(v[s][i]*21*2+(e-1)*2+1); } } } } int main(){ #ifdef LocalHost freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); #endif #ifndef LocalHost freopen("space.in","r",stdin); freopen("space.out","w",stdout); #endif cin>>n>>m>>s>>k;s--; REP(i,n-1)scanf("%d",d+i+1),d[i+1]--; REP(i,m){ int x,y; scanf("%d %d",&x,&y); x--,y--; v[x].pb(y); v[y].pb(x); } solve(); int q; cin>>q; REP(i,q){ int x; scanf("%d",&x); x--; int rres = 1e9; REP(j,21)if(res[x][j][0]!=-1)rres=min(rres,res[x][j][0]); REP(j,21)if(res[x][j][1]!=-1)rres=min(rres,res[x][j][1]); if(rres>10000000)rres=-1; printf("%d ",rres); } puts(""); #ifdef LocalHost printf("TIME: %.3lf\n",ld(clock())/CLOCKS_PER_SEC); #endif return 0; }