U297807 2023“郡园杯”春季编程挑战活动F

题目描述

每个人的健康类别用数字 $k$ 表示,健康值用数组 $p$ 表示。 我们定义一个**健康的人**:若这个人的健康类别为 $k$,则他的健康值需要满足下列条件:$p_1=1, p_2=2,\dots, p_k=k, p_{k+1}=-1, p_{k+2}=-1, \dots$。 即,数组 $p$ 的前 $k$ 项依次为 $1$ 到 $k$,后续的每一项均为 $-1$。 锻炼有 $n$ 个项目,每个项目是一个二元组 $(a_i,b_i)$,每做一项锻炼将会交换健康值中的 $(p_{a_i},p_{b_i})$。 你每天的健康值是不断更新的,你需要不断判断,每一天是否可以通过锻炼变成一个健康的人。 你每天只能锻炼一次,所以你只能在 $n$ 个项目中选择一个连续的区间,在区间内从前往后按顺序锻炼。求最短可成为**健康的人**的区间的长度。

输入格式

第一行输入两个正整数 $n$ 和 $m$,分别表示锻炼的项目数和询问次数。 接下来 $n$ 行,每行输入两个整数,依次表示每个项目对应的二元组。 接下来 $m$ 行,每行先输入一个正整数 $k$ 表示用来描述健康类别,再输入连续的 $k$ 个正整数,表示健康值的前 $k$ 项(第 $k$ 项之后的值无需输入,默认为 $-1$)。

输出格式

输出 $m$ 行,依次输出每一次询问的答案。对于给定询问,若可以成为**健康的人**,则输出最短可成为健康的人的区间的长度,否则输出 $-1$。

说明/提示

【样例解释】 对于样例 $1$,除了第四组情况,均能找到答案。 第一组情况:选择项目 $1$,`[3,2,1] -> [1,2,3]`。 第二组情况:选择项目 $2$,`[2,1,3] -> [1,2,3]`。 第三组情况:选择项目 $1$ 到 $2$,`[3,1,2] -> [2,1,3] -> [1,2,3]`。 【测试点约束】 对于所有测试点:$1\leq n\leq2000, 1\le m\leq10^4, 1\leq k\leq10, 1\le a_i,b_i\le 10$。 每个测试点的具体限制见下表: | 测试点编号 | $n\leq$ | $m\leq$ | | :----------: | :----------: | :----------: | | $1\sim 5$ | $50$ | $10^3$ | | $6\sim 10$ | $2000$ | $10^4$ |