萌新求助线段树
查看原帖
萌新求助线段树
541069
SuperCowHorse楼主2022/8/3 10:14

RT。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+5;
int n,q,a[maxn];
struct tree{
	int l,r,pre,tag;
}t[maxn];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void pushdown(int p){
	int l=ls(p),r=rs(p);
	if(t[p].tag){
		t[l].tag+=t[p].tag;
		t[l].pre+=t[p].tag*(t[l].r-t[l].l+1);
		t[r].tag+=t[p].tag;
		t[r].pre+=t[p].tag*(t[r].r-t[r].l+1);
		t[p].tag=0;
	}
}
void update(int p){
	int l=ls(p),r=rs(p);
	t[p].pre=t[l].pre+t[r].pre;
}
void build(int p,int l,int r){
	t[p].l=l;t[p].r=r;
	if(l==r){
		t[p].pre=a[p];
		return;
	}
	int mid=l+r>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	update(p);
}
void modify(int p,int l,int r,int lx,int rx,int pre){
	if(l>=lx&&r<=rx){
		t[p].tag+=pre;
		t[p].pre+=pre*(t[p].r-t[p].l+1);
		return;
	}
	int mid=l+r>>1;
	pushdown(p);
	if(rx<=mid) modify(ls(p),l,mid,lx,rx,pre);
	else if(lx>mid) modify(rs(p),mid+1,r,lx,rx,pre);
	else{
		modify(ls(p),l,mid,lx,mid,pre);
		modify(rs(p),mid+1,r,mid+1,rx,pre);
	}
	update(p);
}
int query(int p,int l,int r,int lx,int rx){
	if(l>=lx&&r<=rx) return t[p].pre;
	int mid=l+r>>1;
	pushdown(p);
	if(rx<=mid) return query(ls(p),l,mid,lx,rx);
	else if(lx>mid) return query(rs(p),mid+1,r,lx,rx);
	return query(ls(p),l,mid,lx,mid)+query(rs(p),mid+1,r,mid+1,rx);
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	build(1,1,n);
	while(q--){
		int op,l,r,x;
		scanf("%lld%lld%lld",&op,&l,&r);
		if(op==1){
			scanf("%lld",&x);
			modify(1,1,n,l,r,x);
		}
		else
			printf("%lld\n",query(1,1,n,l,r));
	}
	return 0;
}
2022/8/3 10:14
加载中...