#P14871. [ICPC 2020 Yokohama R] LCM of GCDs

[ICPC 2020 Yokohama R] LCM of GCDs

Description

给定一个正整数序列,随后是一系列指令,这些指令指定了对序列的更新以及需要回答的查询。更新和查询以任意顺序给出。

每个更新操作将序列中的一个元素替换为给定值。更新是累积的:后续所有指令都基于指定替换后的序列。

每个查询指定一个(可能更新后的)序列的子序列,以及要从该子序列中排除的元素数量。根据排除哪些元素,将产生一个或多个整数集合。每个这样的集合有其成员的最大公约数(GCD)。查询的答案就是所有这些集合的 GCD 的最小公倍数(LCM)。

:::align{center}

图 H.1. 解答样例输入 1 中最后一个查询 “Q 2 5 2” :::

Input Format

输入包含单个测试用例,格式如下。

$$\begin{aligned} &n \ m \\ &a_1 \ldots a_n \\ &c_1 \\ &\vdots \\ &c_m \end{aligned}$$

第一行有两个整数 nnmmnn1n1051 \le n \le 10^5)是整数序列的长度,mm1m1051 \le m \le 10^5)是指令的数量。第二行给出了原始的整数序列 a1,,ana_1, \ldots, a_n。对于 i=1,,ni = 1, \ldots, n,有 1ai1061 \le a_i \le 10^6。接下来的 mm 行中,每行要么是一个以字母 U 开头的更新指令,要么是一个以字母 Q 开头的查询指令。

更新指令的格式如下。

j x\begin{aligned} &\text{U } j \ x \end{aligned}

该指令表示将序列的第 jj 个元素替换为整数 xx。满足 1jn1 \le j \le n1x1061 \le x \le 10^6。更新是累积的:以下所有指令都基于更新后的序列。

查询指令的格式如下。

$$\begin{aligned} &\text{Q } l \ r \ k \end{aligned}$$

其中,llrr 指定了一个子序列的起始和结束位置,kk 是要从该子序列中排除的元素数量。子序列为 bl,,brb_l, \ldots, b_r,这里 b1,,bnb_1, \ldots, b_n 是在应用该查询之前的所有更新后得到的序列。满足 1l1 \le l0k20 \le k \le 2,且 l+krnl + k \le r \le n

Output Format

对于更新指令,不需要输出。对于每个查询指令,输出一行,该行内容是:从序列 bl,,brb_l, \ldots, b_r 中排除 kk 个元素形成的所有子序列对应的整数集合,计算每个集合的 GCD,再计算这些 GCD 的 LCM。

5 10
12 10 16 28 15
Q 1 3 1
Q 3 4 0
Q 2 2 0
Q 2 5 2
U 3 21
Q 1 3 1
Q 2 4 1
Q 3 5 1
Q 4 4 0
Q 2 5 2
4
4
10
20
6
14
21
28
210

Hint

对于此测试用例的第一个查询 “Q 1 3 1”,子序列是 12 10 1612\ 10\ 16。排除一个元素会产生三个元素集合:{12,10}\{12, 10\}{12,16}\{12, 16\}{10,16}\{10, 16\}。它们的 GCD 分别是 224422,因此输出应该是它们的 LCM,即 44

注意,第五个指令给出的更新 “U 3 21” 改变了后续相同查询 “Q 1 3 1”(即第六个指令)的答案。该更新使子序列变为 12 10 2112\ 10\ 21。因此,排除一个元素后得到的集合是 {12,10}\{12, 10\}{12,21}\{12, 21\}{10,21}\{10, 21\}。它们的 GCD 分别是 223311,所以这个查询的输出应该是它们的 LCM,即 66