int tp(int n, int P[n]){int p = 0; char v[n]; {int j=n; while(j--) v[j] = 0;} {int j=n; while(j--) if(v[j]) p = !p; else {int x = j; do {x = P[x]; v[x] = 1;} while (x!=j);}} return p;} #include void tc(int n, int P[n]){char v[n]; {int j=n; while(j--) v[j] = 0;} {int j=n; while(j--) { if(P[j]<0 || P[j]>= n) printf("range %d\n", j); v[P[j]] = 1;}} {int j=n; while(j--) if(!v[j]) printf("missing %d\n", j);}} // tests #include int main(){int const n=2000; int q[n]; {int j=n; while(j--) q[j]=j;} {int w=100000; while(w--){int i=random()%n; int j; do j=random()%n; while (i==j); {int e=q[i]; q[i] = q[j]; q[j] = e;} if(!(w&31)) tc(n, q); if(tp(n, q) != (w&1)) printf("Wrong parity %d\n", w);}} return 0;}