#P0907. 栈排序
栈排序
题目描述
假设你有一个数列 ,一个栈 (初始为空),和一个数列 (同样初始为空)。
你可以执行以下操作,直到 和 都为空为止:
- 取出数列 的首元素,将其推入 并从 中移除(如果 不为空);
- 从 中取出栈顶元素,将其添加到数列 的末尾,并从 中弹出该元素(如果不为空)。
你可以以任意顺序执行这些操作。
如果存在一种方法可以使数列 最终按非递减顺序排序,则称数列 为 可栈排序 的。
例如,数列 是可栈排序的,因为如果我们执行以下操作, 将会被排序:
- 从 中移除 并将其推入 ;
- 从 中移除 并将其推入 ;
- 从 中移除 并将其添加到 的末尾;
- 从 中移除 并将其推入 ;
- 从 中移除 并将其添加到 的末尾;
- 从 中移除 并将其添加到 的末尾。
经过所有这些操作后, = ,所以 是可栈排序的。 不是可栈排序。
现在你个一个大小为 的排列 的前 个元素(回想一下,大小为 的排列是一个大小为 的数列,其中从 到 的每个整数恰好出现一次)。你必须恢复剩余的 个元素,使其成为可栈排序的数列。如果有多个答案,选择使 字典序最大的答案(一个数列 字典序大于数列 当且仅当存在某个整数 ,对于每个,,和 都成立)。你不能交换或更改排列的前 个元素。
输出你可以获得的字典序最大的排列 。
如果不存在答案,则输出 。
输入格式
第一行包含两个整数 和 (),分别表示排列的大小和给定元素的数量。
第二行包含 个整数(),表示排列 的前 个元素。这些整数互不相同。
输出格式
如果可能恢复大小为 的可栈排序排列,使得 的前 个元素等于输入中给定的元素,则输出字典序最大的这样的排列。
否则输出 。
样例
5 3
3 2 1
3 2 1 5 4
5 3
2 3 1
-1
5 1
3
3 2 1 5 4
5 2
3 4
-1