区间最大公约数

匿名 (未验证) 提交于 2019-12-03 00:14:01

AcWing

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> #include<set> #define ll long long using namespace std; inline ll read(){     ll x=0,o=1;char ch=getchar();     while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();     if(ch=='-')o=-1,ch=getchar();     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();     return x*o; } const int N=500005; ll n,m,a[N],b[N],c[N]; struct XD_Tree{ll l,r,data;}t[N<<2]; inline ll gcd(ll a,ll b){     if(!b)return a;     return gcd(b,a%b); } inline void build(int p,ll l,ll r){     t[p].l=l;t[p].r=r;     if(l==r){t[p].data=b[l];return;}     ll mid=(l+r)>>1;     build(p<<1,l,mid);build(p<<1|1,mid+1,r);     t[p].data=gcd(t[p<<1].data,t[p<<1|1].data); } inline void change(int p,ll pos,ll v){     int l=t[p].l,r=t[p].r;     if(l==r){t[p].data+=v;return;}     int mid=(l+r)>>1;     if(pos<=mid)change(p<<1,pos,v);     else change(p<<1|1,pos,v);     t[p].data=gcd(t[p<<1].data,t[p<<1|1].data); } inline ll query(int p,ll ql,ll qr){     int l=t[p].l,r=t[p].r;     if(ql<=l&&qr>=r)return abs(t[p].data);       ll mid=(l+r)>>1,gcdl=0,gcdr=0;     if(ql<=mid)gcdl=query(p<<1,ql,qr);       if(qr>mid)gcdr=query(p<<1|1,ql,qr);     return abs(gcd(gcdl,gcdr)); } inline ll lowbit(ll x){return x&-x;} inline void add(ll x,ll y){for(;x<=n;x+=lowbit(x))c[x]+=y;} inline ll ask(ll x){ll cnt=0;for(;x;x-=lowbit(x))cnt+=c[x];return cnt;} int main(){     n=read();m=read();for(int i=1;i<=n;++i)a[i]=read();     for(int i=1;i<=n;++i)b[i]=a[i]-a[i-1];build(1,1,n);     while(m--){         char ch;cin>>ch;         if(ch=='C'){             ll l,r,val;l=read();r=read();val=read();             add(l,val);if(r+1<=n)add(r+1,-val);             change(1,l,val);if(r+1<=n)change(1,r+1,-val);         }         else if(ch=='Q'){             ll l,r;l=read();r=read();             printf("%lld\n",gcd(a[l]+ask(l),query(1,l+1,r)));         }     }     return 0; } 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!