绝尘影_Sheldow @ 2022-11-24 21:12:55
RT Code:
//head
#include<iostream>
using namespace std;
//update the tree
struct ltr
{
long long w,tag;
}tr[414514];
int n,m,x,y,op;
long long k,a[114514];
void upd(int u)
{
tr[u].w=tr[u*2].w+tr[u*2+1].w;
}
void build(int u,int l,int r)
{
if(l==r)
{
tr[u].w=a[l];
return;
}
build(u*2,l,(l+r)/2);
build(u*2+1,(l+r)/2+1,r);
upd(u);
}
//plus a number to a range
bool ifcontained(int ll,int rr,int l,int r) {return (l<=ll)&&(r>=rr);}
bool ifnotrelated(int ll,int rr,int l,int r) {return (ll>r)||(rr<l);}
void maketag(int u,int len,long long num)
{
tr[u].tag+=num;
tr[u].w+=len*num;
}
void pushdown(int u,int l,int r)
{
maketag(u*2,(l+r)/2-l+1,tr[u].tag);
maketag(u*2+1,r-(l+r)/2,tr[u].tag);
tr[u].tag=0;
}
void add(int u,int ll,int rr,int l,int r,long long num)
{
if(ifcontained(ll,rr,l,r))
{
maketag(u,ll-rr+1,num);
}
else if(!ifnotrelated(ll,rr,l,r))
{
pushdown(u,ll,rr);
add(u*2,ll,(ll+rr)/2,l,r,num);
add(u*2+1,(ll+rr)/2+1,rr,l,r,num);
upd(u);
}
}
//search the answer
long long search(int u,int ll,int rr,int l,int r)
{
if(ifcontained(ll,rr,l,r)) return tr[u].w;
if(!ifnotrelated(ll,rr,l,r))
{
pushdown(u,ll,rr);
return search(u*2,ll,(ll+rr)/2,l,r)+search(u*2+1,(ll+rr)/2+1,rr,l,r);
}
return 0;
}
//main code
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
add(1,1,n,x,y,k);
}
if(op==2)
{
cin>>x>>y;
cout<<search(1,1,n,x,y)<<endl;
}
}
}
// YEEEEES!
by TankYu @ 2022-11-24 21:17:53
@绝尘影_Sheldow add里面maketag的len传参错了
by 绝尘影_Sheldow @ 2022-11-24 21:24:36
@TankYu 看到了,是rr-ll+1 过了!Thanks