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
| #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6+10; int n,m,a[MAXN]; int lowbit(int x) { return x&-x; } struct fenwick { int c[MAXN]; void modify(int pos,int val) { for(int i=pos;i<=n;i+=lowbit(i)) c[i]+=val; } int query(int pos) { int ans=0; for(int i=pos;i>0;i-=lowbit(i)) ans+=c[i]; return ans; } }qwq1,qwq2; int pre_sum(int x) { return (x+1)*qwq1.query(x)-qwq2.query(x); } int query(int l,int r) { return pre_sum(r)-pre_sum(l-1); } int read() { int x=0,f=1; char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0',c=getchar();} return x*f; } signed main() { n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++) { int d=a[i]-a[i-1]; qwq1.modify(i,d); qwq2.modify(i,d*i); } for(int i=1;i<=m;i++) { int opt=read(); if(opt==1) { int l=read(),r=read(),val=read(); qwq1.modify(l,val); qwq1.modify(r+1,-val); qwq2.modify(l,val*l); qwq2.modify(r+1,-val*(r+1)); } else { int l=read(),r=read(); printf("%lld\n",query(l,r)); } } return 0; }
|