Pavel cooks barbecue. There are n skewers, they lay on a brazier in a row, each on one of n positions. Pavel wants each skewer to be cooked some time in every of n positions in two directions: in the one it was directed originally and in the reversed direction.

Pavel has a plan: a permutation p and a sequence b1, b2, ..., bn, consisting of zeros and ones. Each second Pavel move skewer on position i to position pi, and if bi equals 1 then he reverses it. So he hope that every skewer will visit every position in both directions.

Unfortunately, not every pair of permutation p and sequence b suits Pavel. What is the minimum total number of elements in the given permutation p and the given sequence b he needs to change so that every skewer will visit each of 2n placements? Note that after changing the permutation should remain a permutation as well.

There is no problem for Pavel, if some skewer visits some of the placements several times before he ends to cook. In other words, a permutation p and a sequence b suit him if there is an integer k (k ≥ 2n), so that after k seconds each skewer visits each of the 2n placements.

It can be shown that some suitable pair of permutation p and sequence b exists for any n.

Input

The first line contain the integer n (1 ≤ n ≤ 2·105) — the number of skewers.

The second line contains a sequence of integers p1, p2, ..., pn (1 ≤ pi ≤ n) — the permutation, according to which Pavel wants to move the skewers.

The third line contains a sequence b1, b2, ..., bn consisting of zeros and ones, according to which Pavel wants to reverse the skewers.

Output

Print single integer — the minimum total number of elements in the given permutation p and the given sequence b he needs to change so that every skewer will visit each of 2n placements.

Examples

Input

4
4 3 2 1
0 1 1 1


Output

2


Input

3
2 3 1
0 0 0


Output

1

Note

In the first example Pavel can change the permutation to 4, 3, 1, 2.

In the second example Pavel can change any element of b to 1.
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200009;
int fa[maxn];
int findd(int x) {
  if (fa[x] == x) {
    return x;
  }
  return fa[x] = findd(fa[x]);
}
void bcj(int x, int y) {
  int fx = findd(x);
  int fy = findd(y);
  if (fx == fy)
    return;
  else if (fx < fy) {
    fa[fy] = fx;
    fa[y] = findd(y);
  } else {
    fa[fx] = fy;
    fa[x] = findd(x);
  }
}
struct Ren {
  int f, n, id;
};
Ren ren[maxn];
int cmp(Ren a, Ren b) { return a.f < b.f; }
int main() {
  int n, aaa;
  int num[maxn];
  bool has[maxn];
  int suan[maxn];
  while (scanf("%d", &n) != EOF) {
    int cnt = 0;
    memset(has, false, sizeof(has));
    for (int i = 0; i < maxn; i++) {
      fa[i] = i;
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      scanf("%d", &num[i]);
    }
    for (int i = 0; i < n; i++) {
      scanf("%d", &aaa);
      if (aaa == 1) {
        cnt++;
      }
    }
    if (cnt % 2 == 0) {
      ans++;
    }
    for (int i = 1; i <= n; i++) {
      bcj(i, num[i]);
    }
    for (int i = 1; i <= n; i++) {
      fa[i] = findd(i);
    }
    int tuan = 0;
    for (int i = 1; i <= n; i++) {
      if (has[fa[i]] == false) {
        tuan++;
        has[fa[i]] = true;
      }
    }
    if (tuan == 1) {
      memset(suan, 0, sizeof(suan));
      bool flag = true;
      for (int i = 1; i <= n; i++) {
        if (suan[num[i]] == 0) {
          suan[num[i]]++;
        } else {
          suan[num[i]]++;
          flag = false;
        }
      }
      if (flag) {
        printf("%d\n", ans);
      } else {
        for (int i = 1; i <= n; i++) {
          if (suan[i] > 1) {
            ans += suan[i] - 1;
          }
        }
        printf("%d\n", ans);
      }
    } else {
      ren[0].f = 0;
      for (int i = 1; i <= n; i++) {
        ren[i].f = fa[i];
        ren[i].n = num[i];
        ren[i].id = i;
      }
      sort(ren + 1, ren + n + 1, cmp);
      memset(suan, 0, sizeof(suan));
      bool flag = true;
      int xianzaituan = 0;
      int youwenti = 0;
      for (int i = 1; i <= n; i++) {
        if (ren[i].f != xianzaituan) {
          xianzaituan = ren[i].f;
          flag = true;
        }
        if (suan[ren[i].n] == 0) {
          ;
        } else if (suan[ren[i].n] > 0 && flag == true) {
          youwenti++;
          flag = false;
        }
        suan[ren[i].n]++;
      }
      ans += tuan;
      ans -= youwenti;
      for (int i = 1; i <= n; i++) {
        if (suan[i] > 1) {
          ans += suan[i] - 1;
        }
      }
      printf("%d\n", ans);
    }
  }
  return 0;
}
