hnoi @ 2023-10-18 23:38:36
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int const maxn=10e5+5;
int a[maxn],mi[4*maxn];
int lz[4*maxn];
inline ll ls(ll x){
return x<<1;
}
inline ll rs(ll x){
return x<<1|1;
}
inline void push_up(ll p)
{
mi[p]=mi[ls(p)]+mi[rs(p)];
}
void build(ll p,ll l,ll r){
lz[p]=0;
if(l==r) {
mi[p]=a[l];
return ;
}
ll mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
}
//void change (int k,int l,int r,int x,int v){//单点修改(建树)
// if(x>r||x<l) return;
// if(l==r&&l==x)
// {
// mi[k]+=v;
// return;
// }
// int mid=(l+r)/2;
// change(2*k,l,mid,x,v);
// change(2*k+1,mid+1,r,x,v);
// push_up(k);
//}
inline void f(ll p,ll l,ll r,ll k){
lz[p]=lz[p]+k;
mi[p]+=k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r){
ll mid=(l+r)>>1;
f(ls(p),l,mid,lz[p]);
f(rs(p),mid+1,r,lz[p]);
lz[p]=0;
}
void update(int k,int l,int r,int x,int y,int t){//区间修改
//l,r为要修改的区间
//x,y为当前节点存储的区间
if(l<=x&&y<=r){
mi[k]+=(y-x+1)*t;
lz[k]+=t;
return;
}
push_down(k,x,y);
int mid=(x+y)>>1;
if(l<=mid) update(ls(k),l,r,x,mid,t);
if(r>mid) update(rs(k),l,r,mid+1,y,t);
push_up(k);
}
long long getsum (int k,int l,int r,int x,int y){//(区间查询-求和)
ll res=0;
if(x<=l&&r<=y) return mi[k];
int mid=(l+r)/2;
push_down(k,l,r);
if(x<=mid) res+=getsum(ls(k),l,mid,x,y);
if(y>mid) res+=getsum(rs(k),mid+1,r,x,y);
return res;
}
int main(){
long long ans=0;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
// change(1,1,n,i,a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
int f,x,y;
scanf("%d%d%d",&f,&x,&y);
if(f==1){
int k;
scanf("%d",&k);
update(1,1,n,x,y,k);
}
else{
cout<<getsum(1,1,n,x,y)<<endl;
}
}
}
by Alexxtl @ 2023-10-18 23:51:59
将
update(1,1,n,x,y,k);
改成
update(1,x,y,1,n,k);
试试?
by hnoi @ 2023-10-20 15:48:39
@Alexxtl 试了一下 还是全wa()但是样例过了