#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(){ vector> e; vector use(n); for(int i = 0; i < n; i++){ p[i] = i; q[ordq[i]] = i; } auto add_path = [&](ll ord[],ll pos[]){ vector s; int mx = -1; for(int i = n - 1; i >= 0; i--){ int v = ord[i]; if(pos[v] > mx){ mx = pos[v]; s.eb(v); } } reverse(s.begin(),s.end()); for(auto v:s) use[v] = 1; for(int i = 0; i + 1 < s.size(); i++){ int x = s[i],y = s[i + 1]; if(x > y) swap(x,y); e.eb(x,y); } }; add_path(p,ordq); add_path(p,ordr); add_path(q,ordr); sort(e.begin(),e.end()); e.erase(unique(e.begin(),e.end()),e.end()); int vcnt = 0; for(int i = 0; i < n; i++) vcnt += use[i]; if(e.size() != vcnt-1){ cout << 0 << endl; return; } for(int i = 0; i < n; i++) a[i] = 0; 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(); } }