Dansey @ 2024-02-20 15:13:57
#include<bits/stdc++.h>
using namespace std;
const int N=5000010;
int n,m,a[N],sum[N*4],tag[N*4];
/*
堆式储存: 左儿子rt*2,右儿子rt*2+1
rt: 当前的根节点
[l, r]: 当前根节点维护的区间
*/
void build(int rt, int l, int r){
if(l == r) {
sum[rt] = a[l];
return;
}else{// 迭代
int mid=(l+r)/2;
build(rt*2,l,mid); // 左
build(rt*2+1,mid+1,r); // 右
sum[rt]=sum[rt*2]+sum[rt*2+1];
}
}
void pushdown(int rt,int l,int r){
tag[rt*2]+=tag[rt];
tag[rt*2+1]+=tag[rt];
int mid=(l+r)/2;
sum[rt*2]+= tag[rt]*(mid-l+1);
sum[rt*2+1]+=tag[rt]*(r-mid);
tag[rt]=0; // 清空tag
}
/*
[x, y]: 询问区间
*/
unsigned long long query(int rt,int l,int r,int x,int y){
if(x<=l && r<= y) return sum[rt]; // 包含
if(r<x || l > y) return 0; // 交集为空
pushdown(rt,l,r);
int mid=(l+r)/2;
unsigned long long result=0;
result+=query(rt*2,l,mid,x,y); // 左
result+=query(rt*2+1, mid + 1, r, x, y); // 右
return result;
}
/*
a[x, y] += v
*/
void modify(int rt,int l,int r,int x,int y,int v){
if(x<=l && r<=y) { // 包含
tag[rt]+=v; // 打标记
sum[rt]+=v*(r-l+1);
return;
}
if(r<x || l>y) return; // 交集为空
pushdown(rt,l,r);
int mid=(l+r)/2;
modify(rt*2,l,mid,x,y,v); // 左
modify(rt*2+1,mid+1,r,x,y,v);
sum[rt]=sum[rt*2]+sum[rt*2+1];
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
int a,x,y,k;
scanf("%d",&a);
if(a==1){
scanf("%d%d%d",&x,&y,&k);
modify(1,1,n,x,y,k);
}else{
scanf("%d%d",&x,&y);
unsigned long long ans=query(1,1,n,x,y);
printf("%u\n",ans);
}
}
return 0;
}
困住好久了:(
by Liyuqiao11 @ 2024-02-20 15:44:23
你用#define int long long就过了,就是全局开longlong
by Dansey @ 2024-02-20 16:21:24
已A 此帖结
谢谢: )