#include #include #include #include #include #include using namespace std; 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){ assert(cnt>0); 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 T; int n,m; int q; int sm_nm=0; int sm_q=0; set g; long long query[510][510]; vector > arr; vector op(vector a,vector b){ vector res(m+3,0); for(int i=1;i<=m;i++){ res[i] = b[a[i]]; } return res; } int cc=0; long long solve(int l,int r){ vector res(m+3,0); if(l== 1){ res = arr[r]; } else { for(int i=1;i<=m;i++){ res[arr[l-1][i]]=i; } res = op(res,arr[r]); } long long sol=0; for(int i=1;i<=m;i++){ sol += i * 1ll * res[i]; } return sol; } int main(){ T=readIntLn(1,1000); while(T--){ arr.clear(); n=readIntSp(1,100000); m=readIntLn(1,100000); assert(n*1ll*m<=200000); sm_nm += n*1ll*m; assert(sm_nm<=200000); arr.resize(n+2,vector(m+3,0)); for(int i=1;i<=n;i++){ g.clear(); for(int j=1;j<=m;j++){ if(j==m){ arr[i][j] = readIntLn(1,m); } else { arr[i][j] = readIntSp(1,m); } assert(!g.count(arr[i][j])); g.insert(arr[i][j]); } } q=readIntLn(1,200000); sm_q += q; assert(q<=200000); vector rs=arr[1]; for(int i=2;i<=n;i++){ rs = op(rs,arr[i]); arr[i] = rs; } if(n <= 500){ for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ query[i][j] = -1; } } } while(q--){ int l,r; l=readIntSp(1,n); r=readIntLn(l,n); if(n <= 500 && query[l][r] != -1){ cout<