#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n,T,cntarb,q;
vector<pair<int,int>> v[100005];
vector<int> id[100005];
int base[100005];
int qle[300005], qri[300005], qrez[300005];
vector<pair<int,int>> qrys[100005];//{jumps, id}
vector<pair<int,int>> con[100005];
int sumr[100005], toroot[100005], depth[100005];
void dfs(int nod)
{
toroot[depth[nod]] = nod;
for(auto [jumps, qid]:qrys[nod])
{
assert(depth[nod] - jumps >= 0);
qrez[qid] = min(qrez[qid], base[nod] + sumr[nod] - sumr[toroot[depth[nod] - jumps]]);
}
for(auto [adj, w]:con[nod])
{
depth[adj] = depth[nod] + 1;
sumr[adj] = sumr[nod] + w;
dfs(adj);
}
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>T;
for(int i=1;i<n;i++)
{
int nr;
cin>>nr;
v[i].resize(nr);
id[i].resize(nr);
for(int j=0;j<nr;j++)
cin>>v[i][j].first>>v[i][j].second;
sort(v[i].begin(), v[i].end());
for(int j=0;j<nr;j++)
{
id[i][j] = ++cntarb;
base[cntarb] = v[i][j].second - v[i][j].first;
}
}
cin>>q;
vector<bool> side(q+2, 0), used(q+2, 0);
map<pair<int,int>, int> mp;
for(int i=1;i<=q;i++)
{
cin>>qle[i]>>qri[i];
if(mp[{qle[i], qri[i]}] == 0)
{
mp[{qle[i], qri[i]}] = i;
used[i] = 1;
}
qrez[i] = INF;
if(v[qle[i]].size() <= v[qri[i]].size())
side[i] = 0;
else
side[i] = 1;
}
//see if the same query appears twice------------------------------------------------------
vector<pair<int,int>> tori(cntarb+2, {-1,-1}), tole(cntarb+2, {-1,-1});
for(int i=1;i+1<n;i++)
{
for(int j=0;j<v[i].size();j++)
{
int unde = -1, minb = T + 1;
for(int x=0;x<v[i+1].size();x++)
{
if(v[i+1][x].first >= v[i][j].second)
{
if(v[i+1][x].second < minb)
{
minb = v[i+1][x].second;
unde = id[i+1][x];
}
}
}
int cost = 0;
if(unde == -1)
{
assert(!v[i+1].empty());
unde = -1;
minb = T + 1;
for(int x=0;x<v[i+1].size();x++)
{
if(v[i+1][x].second < minb)
{
minb = v[i+1][x].second;
unde = id[i+1][x];
}
}
cost = (T - v[i][j].second) + minb;
}
else
{
cost = minb - v[i][j].second;
}
tori[id[i][j]] = {unde, cost};
}
}
for(int i=1;i<=cntarb;i++)
{
if(tori[i].first == -1)
{
tori[i].first = cntarb + 1;
tori[i].second = 0;
}
con[tori[i].first].push_back({i, tori[i].second});
}
for(int i=1;i<=q;i++)
{
if(used[i] && side[i] == 0)
{
for(int j=0;j<v[qle[i]].size();j++)
qrys[id[qle[i]][j]].push_back({qri[i] - qle[i] - 1, i});
}
}
dfs(cntarb + 1);
for(int i=1;i<=cntarb+1;i++)
{
con[i].clear();
qrys[i].clear();
}
for(int i=2;i<n;i++)
{
for(int j=0;j<v[i].size();j++)
{
int maxa = -1, unde = -1;
for(int x=0;x<v[i-1].size();x++)
{
if(v[i-1][x].second <= v[i][j].first)
{
if(v[i-1][x].first > maxa)
{
maxa = v[i-1][x].first;
unde = id[i-1][x];
}
}
}
int cost = 0;
if(unde == -1)
{
maxa = -1, unde = -1;
for(int x=0;x<v[i-1].size();x++)
{
if(v[i-1][x].first > maxa)
{
maxa = v[i-1][x].first;
unde = id[i-1][x];
}
}
cost = (T - maxa) + v[i][j].first;
}
else
{
cost = v[i][j].first - maxa;
}
tole[id[i][j]] = {unde, cost};
}
}
for(int i=1;i<=cntarb;i++)
{
if(tole[i].first == -1)
{
tole[i].first = cntarb + 1;
tole[i].second = 0;
}
con[tole[i].first].push_back({i, tole[i].second});
}
for(int i=1;i<=q;i++)
{
if(used[i] && side[i] == 1)
{
for(int j=0;j<v[qri[i]-1].size();j++)
qrys[id[qri[i]-1][j]].push_back({qri[i] - qle[i] - 1, i});
}
}
dfs(cntarb + 1);
for(int i=1;i<=q;i++)
cout<<qrez[mp[{qle[i],qri[i]}]]<<"\n";
return 0;
}