#include using namespace std; typedef long long ll; #define reps(i,a,b) for(int i=(a);i<(b);++i) #define rep(i,n) reps(i,0,n) #define all(x) (x).begin(),(x).end() #define INF (1000000000) #define MOD (1000000007) #define PI (acos(-1)) class UnionFind{ public: //親の番号を格納する 親だった場合-1*集合のサイズ vector Parent; vector Weight; //コンストラクタ 初めはバラバラの状態 UnionFind(int N){ Parent = vector(N,-1);//要素数N,要素の値-1で初期化 Weight = vector(N,0);//親への距離 } //Aがどのグループに属しているか調べる int root(int A){ if(Parent[A] < 0){ return A;//Aが親だったらA自身を返す }else{ int tmp = root(Parent[A]); Weight[A] += Weight[Parent[A]]; return Parent[A] = tmp;//親に繋ぎなおす } } int weight(int A){ root(A); return Weight[A]; } //頂点数を調べる int size(int A){ return -Parent[root(A)];//Aの根×-1=集合のサイズ } //AとBをくっつける bool connect(int A, int B, int W){ W += Weight[A]; W -= Weight[B]; //Aの根とBの根をくっつける A = root(A); B = root(B); if(A==B)return false;//既に同じグループならそのままでfalseを返す //Aのサイズ>=Bのサイズとする if(size(A)> N >> M; UnionFind Uni(N); rep(i,M){ int p,q; cin >> p >> q; p--;q--; Uni.connect(p,q,1); } int Q; cin >> Q; /* rep(i,N){ cout << Uni.weight(i) << " "; } cout << endl; */ rep(i,Q){ int A; cin >> A; A--; cout << Uni.size(A)-1 << " "; int ma = 0; rep(j,N){ if(Uni.same(A,j)){ ma = max(ma,abs(Uni.weight(A)-Uni.weight(j))); } } if(ma == 1)cout << 0 << endl; else cout << max(0,(ma+1)/2) << endl; } }