答案错误,0分。蒟蒻嘤嘤嘤
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int Maxn=5e5+2;
int n,m;
ll a[Maxn],b[Maxn],c[Maxn],t[Maxn<<2];
inline ll gcd(ll x,ll y)
{
if ((!x)||(!y)) return x^y;
return y==0?x:gcd(y,x%y);
}
void build(int l,int r,int p)
{
if (l==r)
{
t[p]=b[l];
return;
}
int mid=(l+r)>>1,lson=p<<1,rson=p<<1|1;
build(l,mid,lson);
build(mid+1,r,rson);
t[p]=gcd(t[lson],t[rson]);
}
void change(int l,int r,int p,int q,ll d)
{
if (l==r)
{
t[p]+=d;
return;
}
int mid=(l+r)>>1,lson=p<<1,rson=p<<1|1;
if (q<=mid) change(l,mid,lson,q,d);
else change(mid+1,r,rson,q,d);
t[p]=gcd(t[lson],t[rson]);
}
ll ask(int lt,int rt,int l,int r,int p)
{
if (lt<=l&&r<=rt)
return abs(t[p]);
int mid=(l+r)>>1,ansl=0,ansr=0;
if (lt<=mid) ansl=ask(lt,rt,l,mid,p<<1);
if (rt>mid) ansr=ask(lt,rt,mid+1,r,p<<1|1);
return abs(gcd(ansl,ansr));
}
ll query(int x)
{
ll sum=0;
for(;x;x-=x&-x) sum+=c[x];
return sum;
}
void add(int x,ll y)
{
for(;x<=n;x+=x&-x) c[x]+=y;
}
int main()
{
char ch[5];int L,R;ll d;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]),b[i]=a[i]-a[i-1];
build(1,n,1);
for(int i=1;i<=m;++i)
{
scanf("%s%d%d",ch,&L,&R);
if (ch[0]=='C')
{
scanf("%lld",&d);
change(1,n,1,L,d);
add(L,d);
if (R<n)
change(1,n,1,R+1,-d),add(R+1,-d);
}
else
printf("%lld\n",abs(gcd(a[L]+query(L),ask(L+1,R,1,n,1))));
}
return 0;
}
重写一遍就好了。注意n,m不要混
(手残打错,CH4302)
题目也贴出来我看看。
– Shendu.CC 5年前