#L6341. 区间or和
区间or和
题目描述
给定一个长度为 n 的序列,支持两种操作:
- 单点修改:将序列中指定位置的元素更新为新值;
- 区间查询:找到满足「区间 OR 和 ≥ k」的所有区间中,长度最短的区间(区间长度定义为
r-l+1,其中l为区间左端点,r为区间右端点)。若不存在这样的区间,输出-1。
其中,区间 OR 和的定义为:对于区间 [l, r],其 OR 和为 a_l | a_{l+1} | ... | a_r(| 表示按位或运算)。
输入格式
- 第一行包含两个整数
n和q,分别表示序列长度和操作总数; - 第二行包含
n个整数a_1, a_2, ..., a_n,表示初始序列; - 接下来
q行,每行描述一个操作,格式如下:- 若操作格式为
1 i x:表示将a_i修改为x(1 ≤ i ≤ n); - 若操作格式为
2 k:表示执行查询操作,求满足区间 OR 和 ≥k的最短区间长度。
- 若操作格式为
输出格式
- 对于每个查询操作(类型 2),输出一行整数,表示最短区间长度;若无解,输出
-1。
样例输入
2 3
0 2
2 3
1 1 1
2 3
样例输出
-1
2
数据范围与提示
- 对于 100% 的数据:
0 ≤ a_i, k ≤ 2^30,1 ≤ n, q ≤ 50000; - 按位或运算性质:OR 和具有单调性(区间越长,OR 和不会减小)。