【题意】
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:
1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。
2、“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。
对于每个询问,输出一个整数表示答案。
【输入格式】
第一行两个整数N,M。
第二行N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
【输出格式】
对于每个询问,输出一个整数表示答案。
每个答案占一行。
【数据范围】
N≤500000,M≤100000
【输入样例】
5 5
1 3 5 7 9
Q 1 5
C 1 5 1
Q 1 5
C 3 3 6
Q 2 4
【输出样例】
1
2
4
思路分析:
- 看到区间修改、区间查询,可以联想到用线段树和树状数组
- 易证最大公约数的一个性质:(a,b,c,d)=((a,b),(c,d)),满足线段树两两合并的操作,故可在树里设一个d值来表示这段区间的最大公约数
- 由于同时加数会严重破坏一段区间最大公约数的维护,我们要根据最大公约数的性质转化,另寻出路,不能直接维护原数列。这时引入最大公约数的另一个性质:(a,b)= (a,a-b) (可以看作是辗转相除法的特殊情况) 和 (a,b,c)&