SP20849 IQUERY - Interesting queries

题目描述

NIT Durgapur 计算机科学系的学生因为课程繁重而感到无聊和疲惫。临近期末考试,大家都在努力准备,以期在即将到来的算法考试中取得好成绩。为了给他们制造一些挑战,考试中出现了一道令人意外的题目。题目看似简单,但要求尽可能优化代码。 现在,轮到你来解决这个问题了。初始时,有一个包含 $N$ 个非负整数的数组(采用从 1 开始的索引),并需要根据这个数组处理 $Q$ 个查询。在每次查询中,可以执行以下三种操作之一:计算某一范围内所有子集乘积的和;计算某一范围内所有子集按位与的和;或者更新数组中的一个元素。所有的计算结果都需要对 $(10^9 + 7)$ 取模。如果查询类型为 'M',则计算乘积和;如果是 'A',则计算按位与和;如果是 'U',则进行更新操作。详情请参阅示例部分。 **注意**:在 C、C++ 以及大多数编程语言中,按位与运算符为 `&`。使用其他语言时,请查阅相关文档。

输入格式

第一行是一个整数 $N$,表示数组的元素数量。第二行包含 $N$ 个整数,表示数组中的具体元素。然后是一个整数 $Q$,表示有多少次查询。随后的每行描述一次查询:如果是 'M',则表示计算乘积的和;如果是 'A',则表示计算按位与的和;如果是 'U',则表示更新元素。如果查询为 'M' 或 'A',后面会有两个整数 $i$ 和 $j$,指定数组的范围。如果是 'U',后面会有两个整数,分别表示位置和要更新的新值。

输出格式

对每个 'M' 和 'A' 类型的查询,输出计算结果。对于 'U' 类型的查询,则不需要输出内容。

说明/提示

- $1 \leq N \leq 5$ - $1 \leq Q \leq 5$ - $1 \leq i \leq j \leq N$ - 要更新的元素的最大值为 $10^5$ **样例输入** ``` 3 1 2 3 5 M 1 3 A 1 3 U 2 5 M 1 3 A 1 3 ``` **样例输出** ``` 23 9 47 13 ``` **解释** - 第一次查询是计算乘积的和:$1 + 2 + 3 + 1 \times 2 + 1 \times 3 + 2 \times 3 + 1 \times 2 \times 3 = 23$。 - 第二次查询是计算按位与的和:$1 + 2 + 3 + 1\&2 + 1\&3 + 2\&3 + 1\&2\&3 = 9$。 - 第三次查询是更新操作,数组变为 $1, 5, 3$。 - 第四次查询是计算新数组中乘积的和:$1 + 5 + 3 + 1 \times 5 + 1 \times 3 + 3 \times 5 + 1 \times 3 \times 5 = 47$。 - 第五次查询是计算新数组中按位与的和:$1 + 5 + 3 + 1\&5 + 1\&3 + 3\&5 + 1\&3\&5 = 13$。 **本翻译由 AI 自动生成**