RT
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5;
ll _,n,q;
struct node{
ll l,r,mid_num;
}t[MAXN];
ll arr[MAXN],len,pos;
ll x,y;
ll L,R,mid,ans;
ll check(ll num){
ll res=0;
ll now_l=t[x].l,now_r=t[x].r;
if(num>arr[now_r])res=now_r-now_l+1;
else if(num<arr[now_l])res=0;
else{
ll qwq=lower_bound(arr+now_l,arr+now_r+1,num-1)-arr;
res+=(qwq-now_l+1);
}
now_l=t[y].l,now_r=t[y].r;
if(num>arr[now_r])res+=now_r-now_l+1;
else if(num<arr[now_l])res+=0;
else{
ll qwq=lower_bound(arr+now_l,arr+now_r+1,num-1)-arr;
res+=(qwq-now_l+1);
}
return res;
}
int main(){
cin>>_;
while(_--){
cin>>n>>q;
pos=1;
for(int i=1;i<=n;i++){
cin>>len;
t[i].l=pos,t[i].r=pos+len-1;
pos+=len;
for(int j=t[i].l;j<=t[i].r;j++)cin>>arr[j];
}
for(int i=1;i<=n;i++)sort(arr+t[i].l,arr+t[i].r+1),t[i].mid_num=arr[t[i].l+(t[i].r-t[i].l+2)/2-1];
// for(int i=1;i<=n;i++)cout<<t[i].mid_num<<" ";
// cout<<endl;
for(int i=1;i<=q;i++){
cin>>x>>y;
len=t[x].r-t[x].l+1+t[y].r-t[y].l+1;
pos=(len+1)/2-1;
L=min(t[x].mid_num,t[y].mid_num),R=max(t[x].mid_num,t[y].mid_num),ans=L;
while(L<=R){
mid=(L+R)>>1;
if(check(mid)>pos)R=mid-1,ans=mid;
else L=mid+1;
}
cout<<ans<<endl;
}
}
return 0;
}
不会二分/fn