#L6341. 区间or和

区间or和

题目描述

给定一个长度为 n 的序列,支持两种操作:

  1. 单点修改:将序列中指定位置的元素更新为新值;
  2. 区间查询:找到满足「区间 OR 和 ≥ k」的所有区间中,长度最短的区间(区间长度定义为 r-l+1,其中 l 为区间左端点,r 为区间右端点)。若不存在这样的区间,输出 -1

其中,区间 OR 和的定义为:对于区间 [l, r],其 OR 和为 a_l | a_{l+1} | ... | a_r| 表示按位或运算)。

输入格式

  • 第一行包含两个整数 nq,分别表示序列长度和操作总数;
  • 第二行包含 n 个整数 a_1, a_2, ..., a_n,表示初始序列;
  • 接下来 q 行,每行描述一个操作,格式如下:
    • 若操作格式为 1 i x:表示将 a_i 修改为 x1 ≤ 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^301 ≤ n, q ≤ 50000
  • 按位或运算性质:OR 和具有单调性(区间越长,OR 和不会减小)。