#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 == 0 || ma == 1){ cout << 0 << endl; continue; } rep(j,30){ if(pow(2,j) < ma && ma <= pow(2,j+1)){ int ans = j+1; cout << ans << endl; break; } } } }