数组(array)
题目描述
有一个数组 a 和一个集合 S,初始每一个数 ai 都有一个值 0 或 1 且 S 为空。一开始每个数是多少都是未知的。每次可能进行以下三种操作:
- MERGE k T:给定集合 T,保证 T 的大小为 k 且与 S 的交集为空。令 x=i∈T⋁ai,对于集合 T 里所有 i,将 ai 修改为 x。
- GET x y:保证 x∈S,已知当前 ax=y,且若 y 等于 1 则将 x 加入集合 S。
- QUERY p:询问在满足当前已知的所有信息的情况下,命题 ∀i∈S,ai=0 是否一定为真。若为假,则询问序列 p,p+1,p+2,…n,1,2,…p−1 中第一个可能使得 i∈S\andai=0 的数 i。
输入格式
本题强制在线。
第一行三个正整数 n,m,t,分别表示数组大小,操作次数和强制在线常数。
接下来是 m 行,每行先输入一个字符串 s:
- 若 s 为
MERGE
,表示是操作 1,接下来输入一个数 k 表示集合 T 的大小,后面紧跟 k 个数 xi,表示集合 T 内的元素。
- 若 s 为
GET
,表示是操作 2,接下来输入两个数 x,y。
- 若 s 为
QUERY
,表示是操作 3,接下来输入一个数 x。
需要注意的是,输入中每一个 x,令上一次的询问结果为 lastans(若没有询问或上次询问命题一定为真则为 0,否则为输出中唯一的数),真实值为 ((x−1+t×lastans)modn)+1。
输出格式
对于每次 3 操作,第一行一个字符串为 YES
或 NO
,表示命题是否为真。若输出为 NO
则需要再输出一个数 i,i 的定义如题目描述。
输入输出样例 1
array1.in |
array1.out |
5 8 0 QUERY 1 MERGE 2 1 3 GET 1 0 MERGE 3 4 2 3 GET 5 1 QUERY 5 GET 4 0 QUERY 2 |
NO 1 NO 2 YES |
说明/提示
样例解释:
第一次询问,每个数的值都不知道,所以第一个可能不确定的数是 1。
第二次询问,当前可能的情况有以下两种:
0 0 0 0 1
,0 1 1 1 1
而集合 S 内只有元素 5,所以命题为假,从 5 开始的序列第一个可能不为 0 的位置是 2。
第三次询问,当前序列只能是 0 0 0 0 1
,此时集合 S 内有元素 5,命题为真。
数据范围:
子任务编号 |
分值 |
特殊性质 |
subtask 1 |
10 |
n≤10,m≤100 |
subtask 2 |
20 |
n,m≤2000 |
subtask 3 |
n,m≤100000,t=0 |
subtask 4 |
t=0 |
subtask 5 |
30 |
无 |
对于全部的数据,1≤k,x≤n≤500000,1≤m≤1000000,1≤∑k≤1000000,0≤t,y≤1。保证任意时刻输入总能存在一种最初的数组 a 使得每个 2 操作符合真实情况。