线段树模板求助
查看原帖
线段树模板求助
746930
NO_OI_NO_LIFE楼主2023/10/1 20:58

rt 工作量很大,所以谢谢了(会关

#include <bits/stdc++.h> 
#define MAXN 100005
#define ll long long 
using namespace std;

ll n,m,a[MAXN];

struct node{
	ll l,r,tag,add;
}tree[MAXN*4];

void build(ll l,ll r,ll id){
	tree[id].l=l;
	tree[id].r=r;
	if(l==r){
		tree[id].add=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(l,mid,id<<1);
	build(mid+1,r,id<<1||1);
	tree[id].add=tree[id<<1].add+tree[id<<1||1].add;
}

void push_down(ll id){
	tree[id<<1].tag+=tree[id].tag;
	tree[id<<1].add+=(tree[id<<1].r-tree[id<<1].l+1)*tree[id].tag;
	
	tree[id<<1||1].tag+=tree[id].tag;
	tree[id<<1||1].add+=(tree[id<<1||1].r-tree[id<<1||1].l+1)*tree[id].tag;
	
	tree[id].tag=0;
}

void update(ll l,ll r,ll id,ll k){
	if(tree[id].l>r||tree[id].r<l) return;
	if(tree[id].l>=l&&tree[id].r<=r){
		tree[id].tag+=k;
		tree[id].add+=(tree[id].r-tree[id].l+1)*k;
		return;
	}
	if(tree[id].tag>0) push_down(id);
	update(l,r,id<<1,k);
	update(l,r,id<<1||1,k);
	tree[id].add=tree[id<<1].add+tree[id<<1||1].add;
}

ll query(ll l,ll r,ll id){
	if(tree[id].l>r||tree[id].r<l) return 0;
	if(tree[id].l>=l&&tree[id].r<=r) return tree[id].add;
	if(tree[id].tag>0) push_down(id);
	return query(l,r,id<<1)+query(l,r,id<<1||1);
}

int main(){
	ll pos,x,y,k;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,n,1);
	while(m--){
		scanf("%lld",&pos);
		if(pos==1){
			scanf("%lld %lld %lld",&x,&y,&k);
			update(x,y,1,k);
		}
		else{
			scanf("%lld %lld",&x,&y);
			printf("%lld\n",query(x,y,1));
		}
	}
    return 0;
}
2023/10/1 20:58
加载中...