rt,为什么自己写的线段树 过不了样例
#include <bits/stdc++.h>
using namespace std;
#define maxn 10000010
#define int long long
int t[maxn<<2],a[maxn],tag[maxn<<2],n,m;
inline int left(int k){return k<<1;}
inline int right(int k){return k<<1|1;}
inline void push_up(int k){t[k]=t[left(k)]+t[right(k)];}// = k.size = k.left.size + k.right.size
inline void f(int p,int l,int r,int k){tag[p]+=k;t[p]+=k*(r-l+1);}
inline void push_down(int p,int l,int r){
int mid=(l+r)>>1;
f(left(p),l,mid,tag[p]);
f(right(p),mid+1,r,tag[p]);
tag[p]=0;
}
void build(int p,int l,int r){// make a tree
tag[p]=0;
if(l==r){
t[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(left(p),l,mid);
build(right(p),mid+1,r);
push_up(p);
}
void update(int L,int R,int l,int r,int p,int k){//L,R 修改的区间 l,r p节点所代表区间 p 节点下标
if(L<=r&&r<=R){
f(p,l,r,k);
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(L<=mid)update(L,R,l,mid,left(p),k);
if(R>mid)update(L,R,mid+1,r,right(p),k);
push_up(p);
}
int query(int L,int R,int l,int r,int p){
push_down(p,l,r);
if(L<=l&&r<=R)return t[p];
int res=0,mid=(l+r)>>1;
// push_down(p,l,r);
if(L<=mid)res+=query(L,R,l,mid,left(p));
if(R>mid)res+=query(L,R,mid+1,r,right(p));
return res;
}
void scan(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
}
signed main(){
int opt;
int b,c,d,e,f;
scan();
build(1,1,n);
while(m--){
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld",&b,&c,&d);
update(b,c,1,n,1,d);
}else{
scanf("%lld%lld",&e,&f);
printf("%lld\n",query(e,f,1,n,1));
}
}
}