bianyanze @ 2024-09-18 22:26:15
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int data[N];
struct segtree{
int l,r,lazy,sum;
}a[N<<2];
void pushup(int u){
a[u].sum=a[u<<1].sum+a[u<<1|1].sum;
}
void build(int u,int l,int r){
a[u].l=l;
a[u].r=r;
if(l==r){
a[u].sum=data[l];
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void pushdown(int u){
if(a[u].lazy){
a[u<<1].sum+=a[u].lazy*(a[u<<1].r-a[u<<1].l+1);
a[u<<1|1].sum+=a[u].lazy*(a[u<<1|1].r-a[u<<1|1].l+1);
a[u<<1].lazy+=a[u].lazy;
a[u<<1|1].lazy+=a[u].lazy;
a[u].lazy=0;
}
}
void update(int l,int r,int k,int u){
if(l<=a[u].l&&r>=a[u].r){
a[u].sum+=k*(r-l+1);
a[u].lazy+=k;
return;
}
pushdown(u);
int mid=a[u].l+a[u].r>>1;
if(l<=mid)update(l,r,k,u<<1);
if(r>mid)update(l,r,k,u<<1|1);
pushup(u);
}
long long query(int u,int l,int r){
if(l<=a[u].l&&r>=a[u].r)return a[u].sum;
pushdown(u);
long long ans=0;
int mid=a[u].l+a[u].r>>1;
if(l<=mid)ans+=query(u<<1,l,r);
if(r>mid)ans+=query(u<<1|1,l,r);
return ans;
}
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch&15),ch=getchar();
return x*f;
}
int n,m;
int op,x,y,z;
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
data[i]=read();
}
build(1,1,n);
for(int i=1;i<=m;i++){
op=read();
if(op==1){
x=read(),y=read(),z=read();
update(x,y,z,1);
}else{
x=read(),y=read();
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
by wild_asriel_X @ 2024-09-20 09:37:10
@bianyanze 你的 update 里的 a[u].sum+=k*(r-l+1)
可能要改成a[u].sum+=k*(a[u].r-a[u].l+1)
by wild_asriel_X @ 2024-09-20 09:38:08
@bianyanze 而且 data 好像是系统关键字。以及这题还要开 long long。
by bianyanze @ 2024-09-20 21:53:24
@chaotic_ data好像不是系统关键字(主要是没加粗) 谢谢你的解答 再问个问题:update开long long吗 thanks
by wild_asriel_X @ 2024-09-21 10:30:45
@bianyanze 正常来说是要开的,但是我改你代码时没开也过了。最好也开一下,但是 segtree 里的 sum 是一定要开 long long 的。