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
| #include <bits/stdc++.h> #define MAXN 100005 #define int long long using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } inline int F1(int x){ return x*(x+1)/2; } inline int F(int l,int r){ return F1(r)-F1(l-1); } inline int G1(int x){ return x*(x+1ll)/2ll*(2ll*x+1ll)/3ll; } inline int G(int l,int r){ return G1(r)-G1(l-1); } int sum1,sum2,sum3; namespace SegmentTree{ #define ARG tree[i].l,tree[i].r struct node{ int l,r; int val1,val2,val3; int tag; inline int len(){ return r-l+1; } }tree[MAXN<<2]; #define lc i<<1 #define rc i<<1|1 inline void Change(int i,int val){ tree[i].val1+=val*G(ARG); tree[i].val2+=val*F(ARG); tree[i].val3+=val*tree[i].len(); tree[i].tag+=val; } inline void pushdown(int i){ if (tree[i].tag){ Change(lc,tree[i].tag); Change(rc,tree[i].tag); tree[i].tag=0; } } inline void pushup(int i){ tree[i].val1=tree[lc].val1+tree[rc].val1; tree[i].val2=tree[lc].val2+tree[rc].val2; tree[i].val3=tree[lc].val3+tree[rc].val3; } void Build(int i,int l,int r){ tree[i].l=l,tree[i].r=r; if (l==r) return ; int mid=(l+r)>>1; Build(lc,l,mid); Build(rc,mid+1,r); } void Update(int i,int L,int R,int val){ if (L<=tree[i].l&&tree[i].r<=R){ Change(i,val); return ; } int mid=(tree[i].l+tree[i].r)>>1; pushdown(i); if (L<=mid) Update(lc,L,R,val); if (mid<R) Update(rc,L,R,val); pushup(i); } void Query(int i,int L,int R){ if (L<=tree[i].l&&tree[i].r<=R){ sum1+=tree[i].val1,sum2+=tree[i].val2,sum3+=tree[i].val3; return ; } int mid=(tree[i].l+tree[i].r)>>1; pushdown(i); if (L<=mid) Query(lc,L,R); if (mid<R) Query(rc,L,R); } } using namespace SegmentTree; int gcd(int a,int b){ return a%b==0?b:gcd(b,a%b); } #undef int int main(){ #define int long long int n=read(),m=read(); Build(1,1,n); char ch[2]; while (m--){ scanf("%s",ch); int l=read(),r=read()-1; if (ch[0]=='C'){ int val=read(); Update(1,l,r,val); } else{ sum1=sum2=sum3=0; Query(1,l,r); int a=-sum1+(l+r)*sum2+(r-l+1-l*r)*sum3; int b=F1(r-l+1); int g=gcd(a,b); printf("%lld/%lld\n",a/g,b/g); } } }
|