社区讨论

救救孩子!样例过了,爆零

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 条回复,欢迎继续交流。

正在加载回复...