社区讨论
救救孩子!样例过了,爆零
P3372【模板】线段树 1参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo8oltle
- 此快照首次捕获于
- 2023/10/27 22:01 2 年前
- 此快照最后确认于
- 2023/10/27 22:01 2 年前
orz
CPP#include<cstdio>
#include<cmath>
#define int long long
template<typename Tp,const int Size> class LineTree{
private:
struct node{
Tp data;
int l,r;
bool lazy;
Tp lz;
};
node t[Size+10];
#define LeftSon(x) x*2
#define RightSon(x) x*2+1
inline void down(int p,Tp lazy){
if(t[p].l==t[p].r){
t[p].data+=lazy;
return;
}
down(LeftSon(p),lazy);
down(RightSon(p),lazy);
t[p].data=t[LeftSon(p)].data+t[RightSon(p)].data;
}
public:
inline void build(int p,int l,int r,const Tp* a){
t[p].l=l,t[p].r=r;
if(l==r){t[p].data=a[l];return;}
int mid=(l+r)>>1;
build(LeftSon(p),l,mid,a);
build(RightSon(p),mid+1,r,a);
t[p].data=t[LeftSon(p)].data+t[RightSon(p)].data;
}
inline void update_one(int p,int x,int data){
if(t[p].l==t[p].r){t[p].data+=data;return;}
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid)update_one(LeftSon(p),x,data);
else update_one(RightSon(p),x,data);
t[p].data=t[LeftSon(p)].data+t[RightSon(p)].data;
}
inline void update_many(int p,int l,int r,int data){
if(t[p].l==t[p].r){t[p].data+=data;return;}
if(l<=t[p].l&&t[p].r<=r){t[p].lazy=true;t[p].lz=data;return;}
if(t[LeftSon(p)].r>=l)update_many(LeftSon(p),l,r,data);
if(t[RightSon(p)].l<=r)update_many(RightSon(p),l,r,data);
}
inline Tp ask(int p,int l,int r){
if(t[p].lazy){
t[p].lazy=false;
down(p,t[p].lz);
t[p].lz=0;
}
if(l<=t[p].l&&t[p].r<=r){return t[p].data;}
int ret=0;
if(t[LeftSon(p)].r>=l)ret+=ask(LeftSon(p),l,r);
if(t[RightSon(p)].l<=r)ret+=ask(RightSon(p),l,r);
return ret;
}
};
LineTree<int,1000001> tree;
int a[1000001];
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
tree.build(1,1,n,a);
for(int i=1;i<=m;i++){
int op,l,r,x;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
scanf("%lld",&x);
tree.update_many(1,l,r,x);
}
if(op==2){
printf("%lld\n",tree.ask(1,l,r));
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...