题目链接:https://ac.nowcoder.com/acm/contest/1033/B
一道很经典的题目,大概就是在线段树上维护序列的差分就好了。
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#define time chrono::system_clock::now().time_since_epoch().count()
#include<ext/pb_ds/tree_policy.hpp>
#define clean(x) memset(x,0,sizeof(x))
#define fil(x,n) fill(x,x+1+n,0)
#define inf 2000000009
#define maxn 1000005
#define int long long
using namespace std;
using namespace __gnu_pbds;
mt19937_64 rnd(time);
cc_hash_table<int,int>mp;
int read() {
int x=1,res=0;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') x=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
res=res*10+(c-'0');
c=getchar();
}
return res*x;
}
struct ST{
int tag[maxn<<2],tr[maxn<<2],a[maxn],gcd[maxn<<2];
void build(int k,int l,int r)
{
if(l==r)
{
tr[k]=gcd[k]=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tr[k]=tr[k<<1]+tr[k<<1|1];
gcd[k]=__gcd(gcd[k<<1],gcd[k<<1|1]);
}
void modify(int k,int l,int r,int x,int val)
{
if(l>r) return;
if(l==r)
{
tr[k]+=val;gcd[k]+=val;
return;
}
int mid=(l+r)>>1;
if(x<=mid) modify(k<<1,l,mid,x,val);
else modify(k<<1|1,mid+1,r,x,val);
tr[k]=tr[k<<1]+tr[k<<1|1];
gcd[k]=__gcd(gcd[k<<1],gcd[k<<1|1]);
}
int query_sum(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return tr[k];
int mid=(l+r)>>1,ans=0;
if(x<=mid) ans+=query_sum(k<<1,l,mid,x,y);
if(mid+1<=y) ans+=query_sum(k<<1|1,mid+1,r,x,y);
return ans;
}
int query_gcd(int k,int l,int r,int x,int y) {
if(x<=l&&r<=y) return gcd[k];
int mid=(l+r)>>1,ans=0;
if(x<=mid) ans=__gcd(ans,query_gcd(k<<1,l,mid,x,y));
if(mid+1<=y) ans=__gcd(ans,query_gcd(k<<1|1,mid+1,r,x,y));
return ans;
}
}st;
signed main()
{
int n=read(),m=read();
vector<int>a(n+1);
for(int i=1;i<=n;i++) {
a[i]=read();
st.a[i]=a[i]-a[i-1];
}
st.build(1,1,n);
for(int i=1;i<=m;i++) {
char x;int l,r,val;
cin>>x;
if(x=='C') {
l=read();r=read();val=read();
st.modify(1,1,n,l,val);
if(r!=n) st.modify(1,1,n,r+1,-val);
}
if(x=='Q') {
l=read();r=read();
int a1=st.query_sum(1,1,n,1,l);
int a2=st.query_gcd(1,1,n,l+1,r);
printf("%lld\n",abs(__gcd(a1,a2)));
}
}
return 0;
}