#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
typedef long long LL;
LL sum1[N];
LL sum2[N];
int n,q;
void add(int p,LL x){
for(int i=p;i<=n;i+=i&-i)
{
sum1[i]+=x;
sum2[i]+=p*x;
}
}
void range_add(int l,int r,LL x){
add(l,x);
add(r+1,-x);
}
LL ask(int p){
LL res=0;
for (int i = p; i; i -= i & -i)
res += (p + 1) * sum1[i] - sum2[i];
return res;
}
LL range_ask(int l,int r){
return ask(r)-ask(l-1);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
LL a;
scanf("%lld",&a);
range_add(i,i,a);
}
for(int i=1;i<=q;i++){
int op,l,r;
LL x;
scanf("%d%d%d",&op,&l,&r);
if(op==1){
scanf("%lld",&x);
range_add(l,r,x);
}
else
printf("%lld\n",range_ask(l,r));
}
return 0;
}
树状数组 :区间修改,区间查询
猜你喜欢
转载自blog.csdn.net/qq_47154574/article/details/108810553
今日推荐
周排行