← Home
package main

import (
	"io"
	"os"
	"strconv"
)

const BS = 300

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func (fs *FastScanner) nextInt() int {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return sign * val
}

var (
	n, m      int
	par       []int
	size      []int
	heavy     []int
	top       []int
	pos       []int
	tval      []int
	first     []int
	to        []int
	nxt       []int
	raw       []int
	act       []bool
	lazy      []int
	freq      []uint16
	blockBase []int
	blockEnd  []int
	rangeSize int
	offset    int
)

func collectPath(u int, ls []int, rs []int) int {
	k := 0
	for u != 0 {
		tu := top[u]
		if tu == 1 {
			ls[k] = pos[1]
			rs[k] = pos[u]
			k++
			break
		}
		ls[k] = pos[tu]
		rs[k] = pos[u]
		k++
		u = par[tu]
	}
	return k
}

func rangeCountEq(l, r, target int) int {
	if l > r {
		return 0
	}
	bl := l / BS
	br := r / BS
	if bl == br {
		cnt := 0
		lz := lazy[bl]
		for i := l; i <= r; i++ {
			if act[i] && raw[i]+lz == target {
				cnt++
			}
		}
		return cnt
	}
	cnt := 0
	lz := lazy[bl]
	end := blockEnd[bl]
	for i := l; i <= end; i++ {
		if act[i] && raw[i]+lz == target {
			cnt++
		}
	}
	for b := bl + 1; b < br; b++ {
		cnt += int(freq[blockBase[b]+target-lazy[b]+offset])
	}
	lz = lazy[br]
	start := br * BS
	for i := start; i <= r; i++ {
		if act[i] && raw[i]+lz == target {
			cnt++
		}
	}
	return cnt
}

func rangeAdd(l, r, delta int) {
	if l > r {
		return
	}
	bl := l / BS
	br := r / BS
	if bl == br {
		base := blockBase[bl]
		for i := l; i <= r; i++ {
			old := raw[i]
			if act[i] {
				freq[base+old+offset]--
				freq[base+old+delta+offset]++
			}
			raw[i] = old + delta
		}
		return
	}
	base := blockBase[bl]
	end := blockEnd[bl]
	for i := l; i <= end; i++ {
		old := raw[i]
		if act[i] {
			freq[base+old+offset]--
			freq[base+old+delta+offset]++
		}
		raw[i] = old + delta
	}
	for b := bl + 1; b < br; b++ {
		lazy[b] += delta
	}
	base = blockBase[br]
	start := br * BS
	for i := start; i <= r; i++ {
		old := raw[i]
		if act[i] {
			freq[base+old+offset]--
			freq[base+old+delta+offset]++
		}
		raw[i] = old + delta
	}
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data, n: len(data)}

	n = fs.nextInt()
	m = fs.nextInt()

	par = make([]int, n+1)
	first = make([]int, n+1)
	for i := 1; i <= n; i++ {
		first[i] = -1
	}
	to = make([]int, n-1)
	nxt = make([]int, n-1)

	ec := 0
	for i := 2; i <= n; i++ {
		p := fs.nextInt()
		par[i] = p
		to[ec] = i
		nxt[ec] = first[p]
		first[p] = ec
		ec++
	}

	tval = make([]int, n+1)
	for i := 1; i <= n; i++ {
		tval[i] = fs.nextInt()
	}

	size = make([]int, n+1)
	heavy = make([]int, n+1)
	top = make([]int, n+1)
	pos = make([]int, n+1)

	order := make([]int, 0, n)
	stack := make([]int, 1, n)
	stack[0] = 1
	for len(stack) > 0 {
		u := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, u)
		for e := first[u]; e != -1; e = nxt[e] {
			stack = append(stack, to[e])
		}
	}

	for i := len(order) - 1; i >= 0; i-- {
		u := order[i]
		sz := 1
		hv := 0
		for e := first[u]; e != -1; e = nxt[e] {
			v := to[e]
			sz += size[v]
			if size[v] > size[hv] {
				hv = v
			}
		}
		size[u] = sz
		heavy[u] = hv
	}

	stackU := make([]int, 1, n)
	stackH := make([]int, 1, n)
	stackU[0] = 1
	stackH[0] = 1
	cur := 0
	for len(stackU) > 0 {
		u := stackU[len(stackU)-1]
		h := stackH[len(stackH)-1]
		stackU = stackU[:len(stackU)-1]
		stackH = stackH[:len(stackH)-1]
		for u != 0 {
			top[u] = h
			pos[u] = cur
			cur++
			hv := heavy[u]
			for e := first[u]; e != -1; e = nxt[e] {
				v := to[e]
				if v != hv {
					stackU = append(stackU, v)
					stackH = append(stackH, v)
				}
			}
			u = hv
		}
	}

	rangeSize = 2*n + 1
	offset = n

	numBlocks := (n + BS - 1) / BS
	blockBase = make([]int, numBlocks)
	blockEnd = make([]int, numBlocks)
	lazy = make([]int, numBlocks)
	freq = make([]uint16, numBlocks*rangeSize)

	for b := 0; b < numBlocks; b++ {
		blockBase[b] = b * rangeSize
		e := (b+1)*BS - 1
		if e >= n {
			e = n - 1
		}
		blockEnd[b] = e
	}

	raw = make([]int, n)
	act = make([]bool, n)
	for i := 1; i <= n; i++ {
		p := pos[i]
		raw[p] = -tval[i]
		act[p] = true
		b := p / BS
		freq[blockBase[b]+raw[p]+offset]++
	}

	ans := 0
	out := make([]byte, 0, m*8)
	var ls, rs [64]int

	for i := 0; i < m; i++ {
		q := fs.nextInt()
		if q > 0 {
			u := q
			k := collectPath(par[u], ls[:], rs[:])
			cnt := 0
			for j := 0; j < k; j++ {
				cnt += rangeCountEq(ls[j], rs[j], 0)
			}
			ans += cnt
			for j := 0; j < k; j++ {
				rangeAdd(ls[j], rs[j], 1)
			}
			p := pos[u]
			b := p / BS
			if raw[p]+lazy[b] > 0 {
				ans--
			}
			freq[blockBase[b]+raw[p]+offset]--
			act[p] = false
		} else {
			u := -q
			k := collectPath(par[u], ls[:], rs[:])
			cnt := 0
			for j := 0; j < k; j++ {
				cnt += rangeCountEq(ls[j], rs[j], 1)
			}
			ans -= cnt
			for j := 0; j < k; j++ {
				rangeAdd(ls[j], rs[j], -1)
			}
			p := pos[u]
			b := p / BS
			act[p] = true
			freq[blockBase[b]+raw[p]+offset]++
			if raw[p]+lazy[b] > 0 {
				ans++
			}
		}
		if i > 0 {
			out = append(out, ' ')
		}
		out = strconv.AppendInt(out, int64(ans), 10)
	}
	out = append(out, '\n')
	os.Stdout.Write(out)
}