#include #include #define eb emplace_back using namespace std; using ll = long long; ll t,n,m,p[100000],q[100000],r[100000],posq[100000],posr[100000],ordq[100000],ordr[100000],a[100000]; atcoder::fenwick_tree bit; void cdq(int le,int ri){ if(le == ri) return; int mid = (le + ri) / 2; cdq(le,mid); cdq(mid+1,ri); vector left,right; for(int i = le; i <= mid; i++) left.eb(i); for(int i = mid + 1; i <= ri; i++) right.eb(i); auto cmp = [&](int x,int y){return ordq[x] > ordq[y];}; sort(left.begin(),left.end(),cmp); sort(right.begin(),right.end(),cmp); int j = 0; for(auto v:left){ while(j < right.size() && ordq[right[j]] > ordq[v]){ bit.add(ordr[right[j]],1); j++; } a[v] += bit.sum(ordr[v]+1,n); } for(int i = 0; i < j; i++) bit.add(ordr[right[i]],-1); } void solve(){ for(int i = 0; i < n; i++){ p[i] = i; q[ordq[i]] = i; } bit = atcoder::fenwick_tree(n); cdq(0,n-1); ll ans = 1; for(int i = 0; i < n; i++){ ans = ans * max(1ll,a[i]) % m; } cout << ans << endl; } int main(){ cin >> t; while(t--){ cin >> n >> m; for(int i = 0; i < n; i++){ cin >> p[i]; p[i]--; } for(int i = 0; i < n; i++){ cin >> q[i]; q[i]--; posq[q[i]] = i; } for(int i = 0; i < n; i++){ cin >> r[i]; r[i]--; posr[r[i]] = i; } for(int i = 0; i < n; i++){ ordq[i] = posq[p[i]]; ordr[i] = posr[p[i]]; } solve(); } }