过了样例,下载了第一个数据,本地测试肉眼是对的
但交上去Wa了前7个点,RE了后3个点
#include<bits/stdc++.h>
#define ll long long
#define RT register
#define ull unsigned long long
using namespace std;
const int MAXN=1e5+5;
template <typename T>
inline void read(T &x){
x=0; bool f=false; char ch=getchar();
while(ch<'0'||ch>'9'){f=(ch='-'?true:f);ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
x=f?-x:x;
}
template <typename T>
inline void print(T x){
if(x<0) putchar('-'),x=-x;
if(x>=10) print(x/10);
putchar(x%10+'0');
}
ll a[MAXN];
struct Seg_Tree{
int l,r;
ll sum,add;
#define l(x) t[x].l
#define r(x) t[x].r
#define sum(x) t[x].sum
#define add(x) t[x].add
}t[MAXN*4];
inline void pushup(int p){sum(p)=sum(p<<1)+sum(p<<1|1);}
inline void pushdown(int p){
if(add(p)){
add(p<<1)+=add(p);
sum(p<<1)+=(r(p<<1)-l(p<<1)+1)*add(p);
add(p<<1|1)+=add(p);
sum(p<<1|1)+=(r(p<<1|1)-l(p<<1|1)+1)*add(p);
add(p)=0;
}
}
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r){
add(p)=0;
sum(p)=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void modify(int p,int l,int r,ll d){
if(l<=l(p)&&r(p)<=r){
add(p)+=d;
sum(p)+=(r(p)-l(p)+1)*d;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(mid>=l) modify(p<<1,l,r,d);
if(mid<r) modify(p<<1|1,l,r,d);
pushup(p);
}
ll ask(int p,int l,int r){
if(l<=l(p)&&r(p)<=r) return sum(p);
int mid=(l(p)+r(p))>>1;
ll ans=0;
pushdown(p);
if(l<=mid) ans+=ask(p<<1,l,r);
if(r>mid) ans+=ask(p<<1|1,l,r);
return ans;
}
int n,m;
int main(){
read(n);read(m);
for(int i=1;i<=n;i++) read(a[i]);
build(1,1,n);
while(m--){
int op;read(op);
if(op==1){
int x,y;ll k;
read(x),read(y),read(k);
modify(1,x,y,k);
}
else{
int x,y;
read(x);read(y);
print(ask(1,x,y));
putchar('\n');
}
// for(int i=1;i<=n;i++){
// cout<<ask(1,i,i)<<" ";
// }
// cout<<"\n";
}
return 0;
}