思路:線段樹維護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不可混,要時刻看題。
?