Ybtoj过了,落谷WA
#include <bits/stdc++.h>
using namespace std;
long long a[10000001];
struct node
{
long long sum,gcd;
}q[10000001];
void build(long long l,long long r,long long k)
{
if(l==r)
{
q[k]={a[l]-a[l-1],a[l]-a[l-1]};
return;
}
long long mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
q[k].sum=q[k<<1].sum+q[k<<1|1].sum;
q[k].gcd=__gcd(q[k<<1].gcd,q[k<<1|1].gcd);
}
void query(long long l,long long r,long long k,long long v,long long p)
{
if(l==r)
{
q[p].sum+=v;
q[p].gcd+=v;
return;
}
long long mid=(l+r)>>1;
if(k<=mid)
query(l,mid,k,v,p<<1);
else
query(mid+1,r,k,v,p<<1|1);
q[p].sum=q[p<<1].sum+q[p<<1|1].sum;
q[p].gcd=__gcd(q[p<<1].gcd,q[p<<1|1].gcd);
}
long long max_sum(long long l,long long r,long long left,long long right,long long k)
{
if(left<=l&&right>=r)
{
return q[k].sum;
}
long long mid=(l+r)>>1,res=0;
if(left<=mid)
res+=max_sum(l,mid,left,right,k<<1);
if(right>mid)
res+=max_sum(mid+1,r,left,right,k<<1|1);
return res;
}
long long max_gcd(long long l,long long r,long long left,long long right,long long k)
{
if(left<=l&&right>=r)
{
return q[k].gcd;
}
long long mid=(l+r)>>1,res=0;
if(left<=mid)
res=__gcd(res,max_gcd(l,mid,left,right,k<<1));
if(right>mid)
res=__gcd(res,max_gcd(mid+1,r,left,right,k<<1|1));
return res;
}
int main()
{
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++)
{
char g;
int l,r,z;
cin>>g>>l>>r;
if(g=='C')
{
cin>>z,query(1,n,l,z,1),r!=n&&(query(1,n,r+1,-z,1),1);
}
else if(g=='Q')
{
cout<<abs(__gcd(max_gcd(1,n,l+1,r,1),max_sum(1,n,1,l,1)))<<endl;
}
}
return 0;
}