思路:线段树维护a的差分数组的gcd,
因为$gcd(a_1,a_2,a_3,...,a_n)=gcd(a_1,a_2-a_1,a_3-a_2,...,a_n-a_{n-1})$。
原区间修改可以转化为差分数组上的两次单点修改。
因为实际计算时还需要原数,所以用树状数组维护b的增减量。
询问时,用这条语句即可:
printf("%lld\n",abs(gcd(a[L]+szszfuc::ask(L)/*左端的原数*/,segfuc::ask(1,L+1,R))/*其它差分的gcd*/));
注意:长时间测试不对,可以重写代码。
PS:n,m不可混,要时刻看题。