← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

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

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

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

func main() {
	fs := NewFastScanner()

	n := fs.NextInt()
	m := fs.NextInt()

	p := make([]int, n)
	for i := 0; i < n; i++ {
		p[i] = fs.NextInt()
	}

	c := make([]int, n)
	for i := 0; i < n; i++ {
		c[i] = fs.NextInt() - 1
	}

	d := fs.NextInt()
	del := make([]int, d)
	removed := make([]bool, n)
	for i := 0; i < d; i++ {
		del[i] = fs.NextInt() - 1
		removed[del[i]] = true
	}

	adj := make([][]int, m)
	cnt := make(map[int]int, n*2)
	const base = 5000

	addStudent := func(idx int) {
		if p[idx] >= m {
			return
		}
		key := c[idx]*base + p[idx]
		if cnt[key] == 0 {
			adj[p[idx]] = append(adj[p[idx]], c[idx])
		}
		cnt[key]++
	}

	for i := 0; i < n; i++ {
		if !removed[i] {
			addStudent(i)
		}
	}

	matchClub := make([]int, m)
	for i := 0; i < m; i++ {
		matchClub[i] = -1
	}

	visNum := make([]int, m)
	visClub := make([]int, m)
	stamp := 0

	var dfs func(int) bool
	dfs = func(num int) bool {
		if visNum[num] == stamp {
			return false
		}
		visNum[num] = stamp
		for _, club := range adj[num] {
			if visClub[club] == stamp {
				continue
			}
			visClub[club] = stamp
			if matchClub[club] == -1 || dfs(matchClub[club]) {
				matchClub[club] = num
				return true
			}
		}
		return false
	}

	mex := 0
	for mex < m {
		stamp++
		if dfs(mex) {
			mex++
		} else {
			break
		}
	}

	ans := make([]int, d)
	ans[d-1] = mex

	for i := d - 1; i >= 1; i-- {
		addStudent(del[i])
		for mex < m {
			stamp++
			if dfs(mex) {
				mex++
			} else {
				break
			}
		}
		ans[i-1] = mex
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	for i := 0; i < d; i++ {
		fmt.Fprintln(out, ans[i])
	}
	out.Flush()
}