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.
import java.io.*;
import java.util.*;
import java.math.*;

public class Abc {

    InputStream is;
    PrintWriter out;
    
    void solve(){
        //Enter code here 
        int i,j,n,ans=0,c,p;
        n=ni();
        int a[]=new int[n];
        for(i=0;i<n;i++)    a[i]=ni()-1;
        int b[]=new int[n];
        c=0;
        for(i=0;i<n;i++){
            b[i]=ni();
            if(b[i]==1)c++;
        }
        if(c%2==0)ans++;
        boolean d[]=new boolean[n];
        p=0;
        for(i=0;i<n;i++){
            if(!d[i]){
                c=i;
                //out.println(c);
                p++;
                while(!d[c]){
                    d[c]=true;
                    c=a[c];
                }
            }
        }
        if(p>1)ans+=p;
        out.println(ans);
    }
    public static void main(String[] args) {
        Abc play=new Abc();
        play.run();
    }
    void run(){
        is=System.in;
        out=new PrintWriter(System.out);
        solve();
        out.flush();
    }
    
    byte input[]=new byte[1024];
    int len=0,ptr=0;
    int readByte(){
        if(ptr>=len){
            ptr=0;
            try{
                len=is.read(input);
            }catch(IOException e){
                throw new InputMismatchException();
            }
            if(len<=0){
                return -1;
            }
        }
        return input[ptr++];
    }
    boolean isSpaceChar(int c){
        return !( c >= 33 && c <= 126 );
    }
    int skip(){
        int b=readByte();
        while(b!=-1 && isSpaceChar(b)){
            b=readByte();
        }
        return b;
    }
    
    char nc(){
        return (char)skip();
    }
    String ns(){
        int b=skip();
        StringBuilder sb=new StringBuilder();
        while(!isSpaceChar(b)){
            sb.appendCodePoint(b);
            b=readByte();
        }
        return sb.toString();
    }
    int ni(){
        int n=0,b=readByte();
        boolean minus=false;
        while(b!=-1 && !( (b>='0' && b<='9') || b=='-')){
            b=readByte();
        }
        if(b=='-'){
            minus=true;
            b=readByte();
        }
        while(b>='0' && b<='9'){
            n=n*10 + (b - '0');
            b=readByte();
        }
        return minus ? -n : n;
    }
    long nl(){
        long n=0L;
        int b=readByte();
        boolean minus=false;
        while(b!=-1 && !( (b>='0' && b<='9') || b=='-')){
            b=readByte();
        }
        if(b=='-'){
            minus=true;
            b=readByte();
        }
        while(b>='0' && b<='9'){
            n=n*10 + (b - '0');
            b=readByte();
        }
        return minus ? -n : n;
    }
    double nd(){
        return Double.parseDouble(ns());
    }
    float nf(){
        return Float.parseFloat(ns());
    }
    int[] na(int n){
        int a[]=new int[n];
        for(int i=0;i<n;i++){
            a[i]=ni();
        }
        return a;
    }
    char[] ns(int n){
        char c[]=new char[n];
        int i,b=skip();
        for(i=0;i<n;i++){
            if(isSpaceChar(b)){
                break;
            }
            c[i]=(char)b;
            b=readByte();
        }
        return i==n ? c : Arrays.copyOf(c,i);
    }
}