CF1288E Messenger Simulator
题目描述
Polycarp 是一位非常活跃的流行聊天软件用户,他一直在和朋友们聊天。他有 $n$ 个朋友,编号从 $1$ 到 $n$。
我们称长度为 $n$ 的排列为一个数组,该数组包含 $1$ 到 $n$ 的每个整数且每个只出现一次。
因此,他最近的聊天列表可以用一个长度为 $n$ 的排列 $p$ 表示。$p_1$ 表示 Polycarp 最近一次聊天的朋友,$p_2$ 表示第二最近,以此类推。
最开始,Polycarp 的最近聊天列表 $p$ 是 $1, 2, \dots, n$(也就是说,是一个单位排列)。
之后,他收到了 $m$ 条消息,第 $j$ 条消息来自朋友 $a_j$。这会导致朋友 $a_j$ 移动到排列的第一位,原本在第一位到 $a_j$ 当前所在位置之间的所有人向后移动一位。注意,如果 $a_j$ 已经在第一位,则什么都不会发生。
例如,假设当前的聊天列表为 $p = [4, 1, 5, 3, 2]$:
- 如果收到朋友 $3$ 的消息,则 $p$ 变为 $[3, 4, 1, 5, 2]$;
- 如果收到朋友 $4$ 的消息,则 $p$ 不变,仍为 $[4, 1, 5, 3, 2]$;
- 如果收到朋友 $2$ 的消息,则 $p$ 变为 $[2, 4, 1, 5, 3]$。
对于每个朋友,考虑他在初始状态以及每次收到消息后所处的所有位置。Polycarp 想知道,每个朋友曾经处于的最小位置和最大位置分别是多少。
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \le n, m \le 3 \cdot 10^5$),分别表示 Polycarp 的朋友数和收到的消息数。
第二行包含 $m$ 个整数 $a_1, a_2, \dots, a_m$($1 \le a_i \le n$),表示每条消息来自的朋友编号。
输出格式
输出 $n$ 对整数。对于每个朋友,输出他在初始状态及每次收到消息后所处的最小位置和最大位置。
说明/提示
在第一个样例中,Polycarp 的最近聊天列表变化如下:
- $[1, 2, 3, 4, 5]$
- $[3, 1, 2, 4, 5]$
- $[5, 3, 1, 2, 4]$
- $[1, 5, 3, 2, 4]$
- $[4, 1, 5, 3, 2]$
例如,朋友 $2$ 的位置依次为 $2, 3, 4, 4, 5$,其中最小值为 $2$,最大值为 $5$。因此,朋友 $2$ 的答案为一对 $(2, 5)$。
在第二个样例中,Polycarp 的最近聊天列表变化如下:
- $[1, 2, 3, 4]$
- $[1, 2, 3, 4]$
- $[2, 1, 3, 4]$
- $[4, 2, 1, 3]$
由 ChatGPT 4.1 翻译