#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<int> vi;
typedef vector<ll> vll;
#define FOR(i,n) for (i = 0; i < n; ++i)
#define FORK(i,k,n) for (i = k; i <= n; ++i)
#define FORR(i,k,n) for (i = k; i >= n; --i)
#define re(a,b) memset(a,b,sizeof(a))
#define sz(a) (int)(a.size())
#define MIN(a,b) (a) = min((a),(b))
#define MAX(a,b) (a) = max((a),(b))
#define input(in) freopen(in,"r",stdin)
#define output(out) freopen(out,"w",stdout)
#define ALL(a) a.begin(),a.end()
#define RALL(a) a.rbegin(),a.rend()
#define LEN(a) (int)(a.length())
#define FIN(x) freopen(x,"r",stdin)
#define FOUT(x) freopen(x,"w",stdout)
#define FCLOSE {fclose(stdin); fclose(stdout);}
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define M 1010
#define INF 1001001001
vi a[M]; //
vi b;
ii c[M]; // euler tour vector whose first element stores the height of node and stores the node encountered in euler tour of graph
ii tree[4*M]; // an array of pairs , whose first element stores the height and second stores the node encountered in the euler tour
int f[M]; // array to store first occurrence
int h[M]; // height of each node
bool v[M];
/*** building segment tree ***/
void st(int i,int s,int e)
{
if(s>e)
return ;
if(s==e)
{
tree[i].fi=c[s].fi;
tree[i].se=c[s].se;
return;
}
int k= (s+e)/2;
st(2*i,s,k);
st(2*i+1,k+1,e);
if(tree[2*i].fi<=tree[2*i+1].fi) // if min height of the left tree is less than the min height of right
{
tree[i].fi=tree[2*i].fi; // storing the height
tree[i].se=tree[2*i].se; // storing the node
}
else
{
tree[i].fi=tree[2*i+1].fi;
tree[i].se=tree[2*i+1].se;
}
}
/**** finding the minimum int the range *****/
ii min(int i,int s,int e,int n,int m) // n lower and m upper index of given range
{
if(e<n || s>m || s>e)
{
ii j ;
j.fi=INF; // making a pair to return the pair if the the range is not in required range
j.se=INF;
return j;
}
else if(s>=n && e<=m )
{
return tree[i];
}
int k=(s+e)/2;
ii t1=min(2*i,s,k,n,m);
ii t2=min(2*i+1,k+1,e,n,m);
if(t1.fi<=t2.fi)
{
return t1;
}
else
{
return t2;
}
}
/**** dfs which does euler tour of the graph also stores the height and its first occurrence int the euler tour ****/
void dfs(int n,int height)
{
b.pb(n); // vector keeping track of the euler tour
int i;
h[n]=height; // to store the height of each node
f[n]=sz(b)-1; // to store the first occurrence of each node
v[n]=true;
FOR(i,sz(a[n]))
{
if(v[a[n][i]]==false)
{
dfs(a[n][i],height+1);
b.pb(n); // adding the parent again after
}
}
}
/*** initializing everything *****/
void init() // to initialize all the arrays
{
int i;
b.clear();
FOR(i,M)
{
a[i].clear();
f[i]=0;
h[i]=0;
v[i]=false;
}
FOR(i,4*M)
{
tree[i].fi=INF;
tree[i].se=0;
}
}
// ii is typedef which represents pair<int,int>
int main()
{
ios_base::sync_with_stdio(false);cin.tie(0);
int t;
cin >> t;
int mv=1;
while(t--)
{
init();
int n,i,j,m,x,y;
cin >> n;
FORK(i,1,n)
{
cin >> m;
FOR(j,m)
{
cin >> x;
a[i].pb(x);
}
}
b.pb(0); // storing first elemnent 0
dfs(1,1); // taking one as root node
FOR(i,sz(b)) // creating the pair array to make segment tree
{
// cout << b[i] << "\n";
c[i].fi=h[b[i]]; // storing the height of the node
c[i].se=b[i]; //storing the node
}
n=sz(b); // taking the size of euler tour
st(1,1,n); // making segment tree
//cout << "\n";*/
/*** query part ***/
int q;
cin >> q;
cout << "Case " << mv << ":\n";
while(q--)
{
int c;
cin >> x >> y;
if(f[y]<f[x])
{
swap(x,y);
}
ii k=min(1,1,n,f[x],f[y]); // the minimum height pair
cout << k.se << "\n"; // the minimum height node
}
mv++;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwp0eXBlZGVmIHZlY3RvcjxpaT4gdmlpOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmxsOwojZGVmaW5lIEZPUihpLG4pIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCiNkZWZpbmUgRk9SSyhpLGssbikgZm9yIChpID0gazsgaSA8PSBuOyArK2kpCiNkZWZpbmUgRk9SUihpLGssbikgZm9yIChpID0gazsgaSA+PSBuOyAtLWkpCgojZGVmaW5lIHJlKGEsYikgICBtZW1zZXQoYSxiLHNpemVvZihhKSkKI2RlZmluZSBzeihhKSAgICAgIChpbnQpKGEuc2l6ZSgpKQojZGVmaW5lIE1JTihhLGIpICAgICAoYSkgPSBtaW4oKGEpLChiKSkKI2RlZmluZSBNQVgoYSxiKSAgICAgKGEpID0gbWF4KChhKSwoYikpCiNkZWZpbmUgaW5wdXQoaW4pICAgIGZyZW9wZW4oaW4sInIiLHN0ZGluKQojZGVmaW5lIG91dHB1dChvdXQpICBmcmVvcGVuKG91dCwidyIsc3Rkb3V0KQojZGVmaW5lIEFMTChhKSAgICAgICBhLmJlZ2luKCksYS5lbmQoKQojZGVmaW5lIFJBTEwoYSkgICAgICBhLnJiZWdpbigpLGEucmVuZCgpCiNkZWZpbmUgTEVOKGEpICAgICAgIChpbnQpKGEubGVuZ3RoKCkpCgojZGVmaW5lIEZJTih4KSAgICAgICBmcmVvcGVuKHgsInIiLHN0ZGluKQojZGVmaW5lIEZPVVQoeCkgICAgICBmcmVvcGVuKHgsInciLHN0ZG91dCkKI2RlZmluZSBGQ0xPU0UgICAgICAge2ZjbG9zZShzdGRpbik7IGZjbG9zZShzdGRvdXQpO30KCiNkZWZpbmUgZmkgICAgICAgICAgIGZpcnN0CiNkZWZpbmUgc2UgICAgICAgICAgIHNlY29uZAojZGVmaW5lIHBiICAgICAgICAgICBwdXNoX2JhY2sKI2RlZmluZSBtcCAgICAgICAgICAgbWFrZV9wYWlyCiNkZWZpbmUgIE0gICAgICAgICAgIDEwMTAKI2RlZmluZSBJTkYgICAgICAgICAgMTAwMTAwMTAwMQoKdmkgYVtNXTsgLy8KdmkgYjsKaWkgY1tNXTsgIC8vIGV1bGVyIHRvdXIgdmVjdG9yIHdob3NlIGZpcnN0IGVsZW1lbnQgc3RvcmVzIHRoZSBoZWlnaHQgb2Ygbm9kZSBhbmQgc3RvcmVzIHRoZSBub2RlIGVuY291bnRlcmVkIGluIGV1bGVyIHRvdXIgb2YgZ3JhcGgKaWkgdHJlZVs0Kk1dOyAvLyBhbiBhcnJheSBvZiBwYWlycyAsIHdob3NlIGZpcnN0IGVsZW1lbnQgc3RvcmVzIHRoZSBoZWlnaHQgYW5kIHNlY29uZCBzdG9yZXMgdGhlIG5vZGUgZW5jb3VudGVyZWQgaW4gdGhlIGV1bGVyIHRvdXIgIAppbnQgZltNXTsgICAgLy8gYXJyYXkgdG8gc3RvcmUgZmlyc3Qgb2NjdXJyZW5jZQppbnQgaFtNXTsgICAgLy8gaGVpZ2h0IG9mIGVhY2ggbm9kZQpib29sIHZbTV07Ci8qKiogYnVpbGRpbmcgc2VnbWVudCB0cmVlICoqKi8Kdm9pZCBzdChpbnQgaSxpbnQgcyxpbnQgZSkKewogICAgaWYocz5lKQogICAgcmV0dXJuIDsKICAgIGlmKHM9PWUpCiAgICB7CiAgICB0cmVlW2ldLmZpPWNbc10uZmk7CiAgICB0cmVlW2ldLnNlPWNbc10uc2U7CiAgICAgcmV0dXJuOwogICAgfQogICAgaW50IGs9IChzK2UpLzI7CiAgICBzdCgyKmkscyxrKTsKICAgIHN0KDIqaSsxLGsrMSxlKTsKICAgIGlmKHRyZWVbMippXS5maTw9dHJlZVsyKmkrMV0uZmkpIC8vIGlmIG1pbiBoZWlnaHQgb2YgdGhlIGxlZnQgdHJlZSBpcyBsZXNzIHRoYW4gdGhlIG1pbiBoZWlnaHQgb2YgcmlnaHQgCiAgICB7CiAgICAgICAgdHJlZVtpXS5maT10cmVlWzIqaV0uZmk7ICAvLyBzdG9yaW5nIHRoZSBoZWlnaHQKICAgICAgICB0cmVlW2ldLnNlPXRyZWVbMippXS5zZTsgIC8vIHN0b3JpbmcgdGhlIG5vZGUKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0cmVlW2ldLmZpPXRyZWVbMippKzFdLmZpOwogICAgICAgIHRyZWVbaV0uc2U9dHJlZVsyKmkrMV0uc2U7CiAgICB9Cn0KLyoqKiogZmluZGluZyB0aGUgbWluaW11bSBpbnQgdGhlIHJhbmdlICoqKioqLwppaSBtaW4oaW50IGksaW50IHMsaW50IGUsaW50IG4saW50IG0pIC8vIG4gbG93ZXIgYW5kIG0gdXBwZXIgaW5kZXggb2YgZ2l2ZW4gcmFuZ2UKewogICAgaWYoZTxuIHx8IHM+bSB8fCBzPmUpCiAgICAgewogICAgICAgICBpaSBqIDsKICAgICAgICAgai5maT1JTkY7IC8vIG1ha2luZyBhIHBhaXIgdG8gcmV0dXJuIHRoZSBwYWlyIGlmIHRoZSAgdGhlIHJhbmdlIGlzIG5vdCBpbiByZXF1aXJlZCByYW5nZQogICAgICAgICBqLnNlPUlORjsKICAgICAgICAgcmV0dXJuIGo7CiAgICAgfQogICAgZWxzZSBpZihzPj1uICYmIGU8PW0gKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRyZWVbaV07CiAgICAgfQogICAgaW50IGs9KHMrZSkvMjsKICAgIGlpIHQxPW1pbigyKmkscyxrLG4sbSk7CiAgICBpaSB0Mj1taW4oMippKzEsaysxLGUsbixtKTsKICAgIGlmKHQxLmZpPD10Mi5maSkKICAgIHsKICAgICAgICByZXR1cm4gIHQxOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICByZXR1cm4gdDI7CiAgICB9Cn0KLyoqKiogZGZzIHdoaWNoIGRvZXMgZXVsZXIgdG91ciBvZiB0aGUgZ3JhcGggYWxzbyBzdG9yZXMgdGhlIGhlaWdodCBhbmQgaXRzIGZpcnN0IG9jY3VycmVuY2UgaW50IHRoZSBldWxlciB0b3VyICoqKiovCnZvaWQgZGZzKGludCBuLGludCBoZWlnaHQpCnsKICAgIGIucGIobik7ICAvLyB2ZWN0b3Iga2VlcGluZyB0cmFjayBvZiB0aGUgZXVsZXIgdG91cgogICAgaW50IGk7CiAgICBoW25dPWhlaWdodDsgLy8gdG8gc3RvcmUgdGhlIGhlaWdodCBvZiBlYWNoIG5vZGUgCiAgICBmW25dPXN6KGIpLTE7IC8vICB0byBzdG9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIG5vZGUgCiAgICAgdltuXT10cnVlOyAgCiAgICBGT1IoaSxzeihhW25dKSkKICAgIHsKICAgICAgaWYodlthW25dW2ldXT09ZmFsc2UpCiAgICAgIHsKICAgICAgIGRmcyhhW25dW2ldLGhlaWdodCsxKTsKICAgICAgYi5wYihuKTsgLy8gYWRkaW5nIHRoZSBwYXJlbnQgYWdhaW4gYWZ0ZXIgCiAgICAgIH0KICAgIH0KfQovKioqIGluaXRpYWxpemluZyBldmVyeXRoaW5nICoqKioqLwp2b2lkIGluaXQoKSAvLyAgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIGFycmF5cyAKewogICAgaW50IGk7CiAgICBiLmNsZWFyKCk7CiAgICBGT1IoaSxNKQogICAgewogICAgICAgIGFbaV0uY2xlYXIoKTsKICAgICAgICBmW2ldPTA7CiAgICAgICAgaFtpXT0wOwogICAgICAgIHZbaV09ZmFsc2U7CiAgICB9CiAgICBGT1IoaSw0Kk0pCiAgICB7CiAgICAgIHRyZWVbaV0uZmk9SU5GOwogICAgICB0cmVlW2ldLnNlPTA7CiAgICB9Cn0KLy8gaWkgIGlzIHR5cGVkZWYgd2hpY2ggcmVwcmVzZW50cyBwYWlyPGludCxpbnQ+ICAKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTtjaW4udGllKDApOwogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIGludCBtdj0xOwogICAgd2hpbGUodC0tKQogICAgewogICAgICAgIGluaXQoKTsKICAgICAgICBpbnQgbixpLGosbSx4LHk7CiAgICAgICAgY2luID4+IG47CiAgICAgICAgRk9SSyhpLDEsbikKICAgICAgICB7CiAgICAgICAgICAgIGNpbiA+PiBtOwogICAgICAgICAgICBGT1IoaixtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjaW4gPj4geDsKICAgICAgICAgICAgICAgIGFbaV0ucGIoeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYi5wYigwKTsgLy8gc3RvcmluZyBmaXJzdCBlbGVtbmVudCAwCiAgICAgICAgZGZzKDEsMSk7IC8vIHRha2luZyBvbmUgYXMgcm9vdCBub2RlCiAgICAgICAgRk9SKGksc3ooYikpIC8vIGNyZWF0aW5nIHRoZSBwYWlyIGFycmF5IHRvIG1ha2Ugc2VnbWVudCB0cmVlIAogICAgICAgIHsKICAgICAgICAgLy8gICBjb3V0IDw8IGJbaV0gPDwgIlxuIjsKICAgICAgICAgY1tpXS5maT1oW2JbaV1dOyAvLyBzdG9yaW5nIHRoZSBoZWlnaHQgb2YgdGhlIG5vZGUKICAgICAgICAgY1tpXS5zZT1iW2ldOyAgLy9zdG9yaW5nIHRoZSBub2RlCiAgICAgICAgfQogICAgICAgIG49c3ooYik7IC8vIHRha2luZyB0aGUgc2l6ZSBvZiBldWxlciB0b3VyCiAgICAgICAgc3QoMSwxLG4pOyAvLyBtYWtpbmcgc2VnbWVudCB0cmVlCiAgICAgICAgLy9jb3V0IDw8ICJcbiI7Ki8KICAgICAgICAvKioqIHF1ZXJ5IHBhcnQgKioqLwogICAgICAgIGludCBxOwogICAgICAgIGNpbiA+PiBxOwogICAgICAgIGNvdXQgPDwgIkNhc2UgIiA8PCBtdiA8PCAiOlxuIjsKICAgICAgICB3aGlsZShxLS0pCiAgICAgICAgewogICAgICAgICAgICBpbnQgYzsKICAgICAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICAgICAgaWYoZlt5XTxmW3hdKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgc3dhcCh4LHkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgaWkgIGs9bWluKDEsMSxuLGZbeF0sZlt5XSk7IC8vICB0aGUgbWluaW11bSBoZWlnaHQgcGFpcgogICAgICAgICAgICBjb3V0IDw8IGsuc2UgIDw8ICJcbiI7IC8vIHRoZSBtaW5pbXVtIGhlaWdodCBub2RlCiAgICAgICAgfQogICAgICAgIG12Kys7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=