#include #include using namespace std; #define MAX 150001 long long N; long long P; long long A[MAX], B[MAX], C[MAX], M[MAX], Z[MAX]; void merge(int begin, int end) { if(end-begin < 2) return; if(end-begin == 2) { long long T; if(Z[begin] > Z[begin+1]) P++, T=Z[begin], Z[begin]=Z[begin+1], Z[begin+1]=T; return; } int mid = (begin+end)/2; merge(begin, mid); merge(mid, end); int i = 0, j = 0; while(i+j != end-begin) { if(i < mid-begin && (j >= end-mid || Z[begin+i] < Z[mid+j])) M[i+j] = Z[begin+i], i++; else M[i+j] = Z[mid+j], j++, P+= (mid-begin) - i; } for(i = 0; i < end-begin; i++) Z[begin+i] = M[i]; } long long get(long long* X, long long* Y) { P = 0; int i; // printf("X:"); for(i = 0; i < N; i++) printf(" %lld", X[i]+1); printf("\n"); // printf("Y:"); for(i = 0; i < N; i++) printf(" %lld", Y[i]+1); printf("\n"); for(i = 0; i < N; i++) M[Y[i]] = i; for(i = 0; i < N; i++) Z[i] = M[X[i]]; // printf("Z:"); for(i = 0; i < N; i++) printf(" %lld", Z[i]+1); printf("\n"); merge(0, N); // printf("P=%lld\n", P); return P; } int main() { int i; while(1) { scanf("%lld", &N); if(N==0) return 0; for(i = 0; i < N; i++) { scanf("%lld", &A[i]); A[i]--; } for(i = 0; i < N; i++) { scanf("%lld", &B[i]); B[i]--; } for(i = 0; i < N; i++) { scanf("%lld", &C[i]); C[i]--; } long long inv = 0; inv += get(A,B); inv += get(B,C); inv += get(C,A); // printf("inv=%lld\n", inv); printf("%lld\n", N*(N-1)/2 - inv/2); } }