在互联网中,路由器通过查询转发表来根据数据包的目的地址转发数据包。转发表为每个目的地址指定了数据包下一步应该走的路径(如果有的话)。目的地址是一个无符号整数。转发表包含许多不同的前缀(数千个),每个前缀是一个二元组 $(M, L)$,其中 $M$ 是一个地址掩码(一个无符号整数),$L$ 是一个表示掩码中有效位数(相关位数)的长度。如果目的地址 $D$ 的前 $L$ 个最高有效位与 $M$ 的前 $L$ 个最高有效位相同,则称目的地址 $D$ 与前缀 $(M, L)$ 匹配。
最长前缀匹配:每当一个数据包到达时,路由器必须在其数据库中找到与该数据包目的地址匹配的最长前缀。你需要为一个必须尽快转发数百万个数据包的路由器实现最长前缀匹配算法。
输入格式
第一行输入包含两个整数 $X$ 和 $Y$。$X$ 表示路由器转发表中的前缀数量,$Y$ 表示需要转发的数据包数量。
接下来的 $X$ 行描述这些前缀,每行描述一个前缀,包含一个十六进制表示的掩码,后跟一个十进制表示的长度。每个前缀的编号为其出现的行数减 $1$(即第一个前缀的 ID 为 $0$,第二个为 $1$,依此类推)。
接下来的 $Y$ 行给出需要转发的数据包的目的地址,每行一个数据包(地址也以十六进制给出)。
输出格式
输出包含 $Y$ 行。第 $k$ 行表示输入文件中第 $k$ 个地址的最长前缀匹配算法的结果。结果应当是匹配的最长前缀的编号,如果未找到匹配的前缀,则输出 -1。
样例
输入样例 1
5 5 0xFFFFFF00 24 0xFF000000 8 0xAF230000 16 0x3 31 0 0 0xFFFF0000 0xF0FF0000 0xFFFFFF00 0xAF320000 0x2
输出样例 1
1 4 0 4 3