CF398D Instant Messanger
题目描述
用户 ainta 决定开发一款新的即时通讯软件,名为 "aintalk"。在 aintalk 中,每个用户都可以与其他人聊天。用户 ainta 已经搭建了一些实现此功能的原型函数:
1. login($u$):用户 $u$ 登录 aintalk 并变为在线状态。
2. logout($u$):用户 $u$ 注销并变为离线状态。
3. add\_friend($u$,$v$):用户 $u$ 和用户 $v$ 成为好友,也就是说 $u$ 和 $v$ 互相可以聊天,好友关系是双向的。
4. del\_friend($u$,$v$):解除用户 $u$ 和用户 $v$ 的好友关系,从此 $u$ 和 $v$ 不能再相互聊天。
5. count\_online\_friends($u$):该函数返回用户 $u$ 的当前在线好友数量。
由于该通讯软件正由编号从 $1$ 到 $n$ 的一些用户进行测试,因此没有注册功能。这意味着开始时,部分用户可能已经在线,部分用户之间已经是好友。
用户 ainta 准备用这些函数来实现上述功能,但在正式公开发布之前,希望验证自己的代码是否正确。请你帮助 ainta 验证他的代码。
输入格式
第一行包含三个用空格分隔的整数 $n、m$ 和 $q$($1 \leq n \leq 50000$;$1 \leq m \leq 150000$;$1 \leq q \leq 250000$),分别表示用户的数量、初始已建立的好友关系对数以及查询数。
第二行包含一个整数 $o$($1 \leq o \leq n$),表示开始时在线的用户数。
第三行包含 $o$ 个用空格分隔的整数 $x_1, x_2, ..., x_o$($1 \leq x_i \leq n$),表示在线用户的编号,保证这些编号各不相同。
接下来的 $m$ 行,每行包含两个用空格分隔的整数 $a_i$ 和 $b_i$($1 \leq a_i, b_i \leq n; a_i \neq b_i$),表示初始时分别为 $a_i$ 和 $b_i$ 的用户之间已经是好友。保证输入中没有重复的好友关系。注意,好友关系是双向的。
接下来的 $q$ 行,每行描述一个查询,格式如下:
- "O $u$"($1 \leq u \leq n$):调用 login($u$)。保证调用之前 $u$ 处于离线状态。
- "F $u$"($1 \leq u \leq n$):调用 logout($u$)。保证调用之前 $u$ 处于在线状态。
- "A $u$ $v$"($1 \leq u, v \leq n; u \neq v$):调用 add\_friend($u, v$)。保证调用之前 $u$ 和 $v$ 不是好友。
- "D $u$ $v$"($1 \leq u, v \leq n; u \neq v$):调用 del\_friend($u, v$)。保证调用之前 $u$ 和 $v$ 是好友。
- "C $u$"($1 \leq u \leq n$):调用 count\_online\_friends($u$),并在一行中输出结果。
输出格式
对于每个 count\_online\_friends($u$) 查询,请输出所需的结果,每行一个答案。
说明/提示
由 ChatGPT 5 翻译