#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <limits.h>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <deque>
#include <map>
#include <chrono>
#include <random>
#include <bitset>
#include <tuple>
#include <cassert>
#include "garden.h"
#include "gardenlib.h"
#define SZ(x) (LL)(x.size())
#define FR(i,a,b) for(LL i=(a);i<(b);++i)
#define FOR(i,n) FR(i,0,n)
#define FAST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define A first
#define B second
#define mp(a,b) make_pair(a,b)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef unsigned __int128 U128;
typedef __int128 I128;
typedef std::pair<int,int> PII;
typedef std::pair<LL,LL> PLL;
typedef std::pair<LD,LD> PLD;
using namespace std;
const int LG=31;
void count_routes(int n, int m, int p, int r[][2], int q, int g[]){
int adj[n+1][2];
int far[2*(n+1)][LG];
memset(adj,-1,sizeof(adj));
memset(far,-1,sizeof(far));
FOR(i,m){
int u=r[i][0], v=r[i][1];
if (adj[u][0]==-1) adj[u][0]=v;
else if (adj[u][1]==-1) adj[u][1]=v;
if (adj[v][0]==-1) adj[v][0]=u;
else if (adj[v][1]==-1) adj[v][1]=u;
}
FOR(i,n){
int v=adj[i][0];
if (adj[v][0]==i) v+=n;
far[i][0]=v;
if (adj[i][1]!=-1){
int v=adj[i][1];
if (adj[v][0]==i) far[i+n][0]=v+n;
else far[i+n][0]=v;
}
else far[i+n][0]=v;
}
FR(j,1,LG) FOR(i,2*n){
far[i][j]=far[far[i][j-1]][j-1];
}
FOR(i,q){
int k=g[i], ans=0;
FOR(i,n){
int cur=i;
FOR(j,LG) if (k&(1<<j)) cur=far[cur][j];
if (cur==p || cur==p+n) ans++;
}
answer(ans);
}
}