Polaris_flame @ 2023-10-06 15:07:49
#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define int long long
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN],tag[MAXN<<2],num[MAXN<<2];
void build(int x,int l,int r){
tag[x]=0;
if(l==r){
num[x]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
}
void pushup(int x){
num[x]=num[ls]+num[rs];
}
void f(int x,int l,int r,int k){
tag[x]+=k;
num[x]+=(r-l+1)*k;
}
void pushdown(int x,int l,int r){
f(ls,l,mid,tag[x]);
f(rs,mid+1,r,tag[x]);
tag[x]=0;
}
void add(int x,int l,int r,int L,int R,int k){
if(l>=L&&r<=R){
tag[x]+=k;
num[x]+=(r-l+1)*k;
return ;
}
pushdown(x,l,r);
if(L<=mid) add(ls,l,mid,L,R,k);
if(R>mid) add(rs,mid+1,r,L,R,k);
pushup(x);
}
int query(int x,int l,int r,int L,int R){
int res=0;
if(l>=L&&r<=R) return num[x];
pushdown(x,l,r);
if(L<=mid) res+=query(ls,l,mid,L,R);
if(R>mid) res+=query(rs,mid+1,r,L,R);
return res;
}
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
FL(i,1,n) scanf("%lld",&a[i]);
build(1,1,n);
FL(i,1,m){
int op;
scanf("%lld",&op);
if(op==1){
int x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
add(1,1,n,x,y,k);
}
else{
int x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,1,n,x,y));
}
}
}
QAQ样例过了但是全WA。
by Mini_PEKKA @ 2023-10-06 15:28:34
build 没 pushup
by Mini_PEKKA @ 2023-10-06 15:29:43
@Polaris_flame
by Polaris_flame @ 2023-10-06 15:50:32
@Mini_PEKKA 非常感谢QAQ,用我另一个小号关注您了
本来想着csp-s前过一下模板的结果WA了调不出来。。。