题目描述
小 T 在玩一款游戏,游戏中有彩票。彩票只有中奖与不中奖两种情况。
小 T 玩了一段时间后发现,如果将中奖看作 1,不中奖看作 0 的话,那么一直买彩票后生成的无限长的 01 序列 T 有一个长为 n 的循环节 S。具体来讲,T 满足 Ti=S((i−1)modn)+1。
定义 fi 为只考虑前 i 次买彩票时的中奖率,更具体地,若前 i 个数中有 ci 个1,那么 fi=ici。小T想知道中奖率何时比较高,于是他会有 q 次询问,具体形式如下:
- 给定整数 k,设 fw 为序列 f 中第 k 大的值,求 w 。
- 给定整数 k,求出 fk 的排名,若排名不存在,输出
inf
。
注意:我们称 fa 比 fb 大当且仅当 fa>fb 或 fa=fb∧a<b 。可以证明在这样的定义下,序列 f 中第 k 大的值是存在且唯一的。
输入格式
第一行两个整数 n,q,表示循环节长度与询问次数。
第二行一个 01 序列 S,表示循环节。
接下来 q 行,每行两个整数 op,k,分别表示询问类型和询问参数。op=1 表示第一种询问,即查询第 k 大所在位置,op=2 表示第二种询问,即查询排名。
输出格式
共 q 行,每行一个整数表示答案。
数据范围与提示
对于所有测试数据, 1≤n≤2×105,1≤k≤1010000,1≤q≤20,op∈{1,2},保证 S 为 01 序列。
子任务编号 |
n≤ |
k≤ |
特殊性质 |
分值 |
1 |
105 |
1010000 |
S1=S2=⋯=Sn−1=0,Sn=1 |
1 |
2 |
10 |
1000 |
|
9 |
3 |
105 |
109 |
9 |
4 |
1010000 |
op=2 |
13 |
5 |
S1=1,S2=S3=⋯=Sn=0 |
20 |
6 |
200 |
|
18 |
7 |
105 |
30 |