数据给的是不是有问题,把N开到5e5就过了,但是1e5就不行。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N = 5e5 + 9;
const ll mod=998244353 ;
const ll pp=13131;
vector<int>tree,a,tag;
void buildtree(int i,int s,int t){
if(s==t){
tree[i]=a[s];
return ;
}
int mid=s+t>>1;
buildtree(i<<1,s,mid);
buildtree(i<<1|1,mid+1,t);
tree[i]=tree[i<<1]+tree[i<<1|1];
}
void pushdown(int i,int s,int t){
if(tag[i]){
int mid=s+t>>1;
tag[i<<1]+=tag[i];
tag[i<<1|1]+=tag[i];
tree[i<<1]+=(mid-s+1)*tag[i];
tree[i<<1|1]+=(t-mid)*tag[i];
tag[i]=0;
}
}
void update(int i,int s,int t,int l,int r,int k){
if(s>=l&&t<=r){
tree[i]+=(t-s+1)*k;
tag[i]+=k;
return ;
}
int mid=s+t>>1;
pushdown(i,s,t);
if(mid>=l) update(i<<1,s,mid,l,r,k);
if(mid<r) update(i<<1|1,mid+1,t,l,r,k);
tree[i]=tree[i<<1]+tree[i<<1|1];
}
ll query(int i,int s,int t,int l,int r){
if(s>=l&&t<=r){
pushdown(i,s,t);
return tree[i];
}
int mid=s+t>>1;
ll sum=0;
pushdown(i,s,t);
if(mid>=l) sum+=query(i<<1,s,mid,l,r);
if(mid<r) sum+=query(i<<1|1,mid+1,t,l,r);
return sum;
}
void solve() {
int n,m;
cin>>n>>m;
tree.resize(4*N+9);
tag.resize(4*N+9);
a.resize(n+1);
for(int i=1;i<=n;++i) cin>>a[i];
buildtree(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
update(1,1,n,x,y,k);
}
else{
int x,y;
cin>>x>>y;
cout<<query(1,1,n,x,y)<<'\n';
}
}
}
signed main() {
cin.tie(0)->sync_with_stdio(false);
int t = 1;
// cin>>t;
while (t--) solve();
}