#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
#include <iomanip>
#include <vector>
#include <set>
#include <cctype>
#include <stack>
#include <map>
#include <list>
#include <array>
#include <deque>
#include <bitset>
typedef long long ll;
typedef long double lld;
#define Debug(x) cout<<#x<<":"<<x<<"("<<__LINE__<<")and("<<__FUNCTION__<<")"<<'\n'
using namespace std;
int n, m, r, head[20005], nex[20005], to[20005], en, p[50005], size[10005], fa[10005],ans[10005];
bool visited[10005],flag[10005];
void add(int x, int y) {
nex[++en] = head[x];
head[x] = en;
to[en] = y;
}
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
void dfs(int now,int father) {
fa[now] = father;
visited[now] = true;
size[now] = 1;
for(int i = head[now] ; i ; i = nex[i]) {
int temp = to[i];
if(visited[temp]) continue;
dfs(temp,now);
size[now] += size[temp];
}
}
int main() {
memset(flag,true,sizeof(flag));
cin >> n >> r >> m;
for (int i = 1 ; i < n ; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
dfs(r,r);
for (int i = 1 ; i <= m ; i++) {
p[i] = read();
int sum = 0;
for(int j = head[p[i]] ; j ; j = nex[j]) {
int temp = to[j];
if(temp == fa[p[i]]) continue;
sum += pow(size[temp],2);
}
if(flag) {
ans[p[i]] = pow(size[p[i]],2) - sum;
flag[p[i]] = false;
cout<<pow(size[p[i]],2) - sum<<'\n';
}else{
cout<<ans[p[i]];
}
}
return 0;
}