1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
#include<bits/stdc++.h> using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) { return __gcd(a, b); }
const int N=5e5+10; struct Node{ int l, r; ll sum, gcd; }tr[4*N];
ll a[N];
void pushup(int u){ tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum; tr[u].gcd=gcd(tr[u<<1].gcd, tr[u<<1|1].gcd); }
void build(int u, int l, int r){ tr[u]={l, r};
if(l==r){ tr[u].sum=tr[u].gcd=a[l]-a[l-1]; return; }
int mid=l+r>>1; build(u<<1, l, mid), build(u<<1|1, mid+1, r);
pushup(u); }
ll query_sum(int u, int l, int r){ if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
int mid=tr[u].l+tr[u].r>>1; ll res=0; if(l<=mid) res+=query_sum(u<<1, l, r); if(r>mid) res+=query_sum(u<<1|1, l, r);
return res; }
ll query_gcd(int u, int l, int r){ if(tr[u].l>=l&&tr[u].r<=r) return tr[u].gcd;
int mid=tr[u].l+tr[u].r>>1; if(r<=mid) return query_gcd(u<<1, l, r); else if(l>mid) return query_gcd(u<<1|1, l, r); else return gcd(query_gcd(u<<1, l, r), query_gcd(u<<1|1, l, r)); }
void modify(int u, int x, ll add){ if(tr[u].l==x&&tr[u].r==x){ tr[u].sum+=add; tr[u].gcd+=add; return; }
int mid=tr[u].l+tr[u].r>>1; if(x<=mid) modify(u<<1, x, add); else modify(u<<1|1, x, add);
pushup(u); }
int n, m;
void work(){ scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++) scanf("%lld", &a[i]); a[0]=0;
build(1, 1, n);
while(m--){ char op[2]; scanf("%s", op);
if(*op=='C'){ int l, r; ll d; scanf("%d%d%lld", &l, &r, &d);
modify(1, l, d); if(r+1<=n) modify(1, r+1, -d); }else{ int l, r; scanf("%d%d", &l, &r);
ll x=query_sum(1, 1, l); ll y; if(l+1<=r) y=query_gcd(1, l+1, r); else y=x;
ll res=gcd(x, y);
printf("%lld\n", abs(res)); } } }
int main(){ work(); return 0; }
|