_Gloaming_ @ 2024-11-28 14:42:02
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int rr()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9')
{if(c=='-')f=-1;c=getchar();}
while(c<='9'&&c>='0')
{x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=1e5+10;
struct node
{
int l,r;
ll w,f;
}t[N<<2];
int n,q;
ll a[N];
void up(int k)
{
t[k].w=t[k<<1].w+t[k<<1|1].w;
return;
}
void down(int k)
{
if(t[k].f)
{
t[k<<1].w+=(t[k<<1].r-t[k<<1].l+1)*t[k].f;
t[k<<1|1].w+=(t[k<<1|1].r-t[k<<1|1].l+1)*t[k].f;
t[k<<1].f+=t[k].f;
t[k<<1|1].f+=t[k].f;
t[k].f=0;
}
return;
}
void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;
if(l==r)
{
t[k].w=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
up(k);
}
void add(int k,int l,int r,ll v)
{
if(l<=t[k].l && t[k].r<=r)
{
t[k].f+=v;
t[k].w=(t[k].r-t[k].l+1)*v;//!!!
return;
}
down(k);
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)
add(k<<1,l,r,v);
if(r>mid)
add(k<<1|1,l,r,v);
up(k);
}
ll query(int k,int l,int r)
{
if(l<=t[k].l&&t[k].r<=r)
return t[k].w;
down(k);
ll ans=0;
int mid=(t[k].l+t[k].r)>>1;
if(l<=mid)
ans+=query(k<<1,l,r);
if(r>mid)
ans+=query(k<<1|1,l,r);
up(k);
return ans;
}
int main()
{
n=rr();q=rr();
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(q--)
{
int l,r,v,op;
cin>>op;l=rr();r=rr();
if(op==1)
{
scanf("%lld",&v);
add(1,l,r,v);
}
else
cout<<query(1,l,r)<<"\n";
}
return 0;
}
by aaa1145141919810 @ 2024-11-29 10:22:15
query里不用up
by aaa1145141919810 @ 2024-11-29 10:31:43
t[k].w=(t[k].r-t[k].l+1)*v;//!!!
这一行把等号改成+=