#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FOR(k,a,b) for(int k(a); k < (b); ++k) #define REP(k,a) for(int k=0; k < (a); ++k) #define ABS(a) ((a)>0?(a):-(a)) using namespace std; typedef long long LL; typedef unsigned int uint; typedef pair PII; typedef vector VI; typedef vector VD; typedef vector VPII; typedef vector VVPII; typedef vector VVI; typedef vector VVD; typedef vector VB; typedef vector VVB; typedef vector VL; typedef vector VVL; typedef vector VVD; typedef vector VB; typedef vector VVB; typedef tuple L4; long long readInt(long long l, long long r, char endd) { long long x = 0; int cnt = 0; int fi = -1; bool is_neg = false; while (true) { char g = getchar(); if (g == '-') { assert(fi == -1); is_neg = true; continue; } if ('0' <= g && g <= '9') { x *= 10; x += g - '0'; if (cnt == 0) { fi = g - '0'; } cnt++; assert(fi != 0 || cnt == 1); assert(fi != 0 || is_neg == false); assert(!(cnt>19 || (cnt == 19 && fi>1))); } else if (g == endd) { if (is_neg) { x = -x; } assert(l <= x && x <= r); return x; } else { //assert(false); } } } string readString(int l, int r, char endd) { string ret = ""; int cnt = 0; while (true) { char g = getchar(); assert(g != -1); if (g == endd) { break; } cnt++; ret += g; } assert(l <= cnt && cnt <= r); return ret; } long long readIntSp(long long l, long long r) { return readInt(l, r, ' '); } long long readIntLn(long long l, long long r) { return readInt(l, r, '\n'); } string readStringLn(int l, int r) { return readString(l, r, '\n'); } string readStringSp(int l, int r) { return readString(l, r, ' '); } int main(int argc, char** argv) { #ifdef HOME freopen("SADQ_1.in", "rb", stdin); freopen("out.txt", "wb", stdout); #endif int k, m, s, u, v; k = readIntLn(1,100000); VVL A(k), P(k), S(k); VL::iterator Ait; map rr; int su = 0; REP(i, k) { s = readIntSp(1, 100000); su += s; A[i].resize(s); P[i].resize(s); S[i].resize(s); REP(j, s) { if(j < s - 1) A[i][j] = readIntSp(-1000000000, 1000000000); else A[i][j] = readIntLn(-1000000000, 1000000000); } sort(A[i].begin(), A[i].end()); REP(j, s) { if (j) P[i][j] = P[i][j - 1] + (A[i][j] - A[i][0]); } for (int j = s - 1; j> -1; --j) { if (j < s - 1) S[i][j] = S[i][j + 1] + (A[i].back() - A[i][j]); } } assert(s <= 100000); m = readIntLn(1, 100000); REP(q, m) { LL res = 0; u = readIntSp(1, k); v = readIntLn(1, k); //assert(u != v); --u, --v; if (A[u].size() > A[v].size() || (A[u].size() == A[v].size() && u > v)) swap(u, v); if (rr.count(PII(u, v))) { printf("%lld\n", rr[PII(u, v)]); continue; } Ait = A[v].begin(); REP(i, A[u].size()) { Ait = lower_bound(Ait, A[v].end(), A[u][i]); LL d = distance(A[v].begin(), Ait); // if (d) { res += (A[u][i] - A[v][0])*d; res -= P[v][d - 1]; } if (d