求助,蒟蒻线段树过不了样例
查看原帖
求助,蒟蒻线段树过不了样例
554015
moduyilong楼主2021/10/5 10:23
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,in[100001],sum[400004],lazy[400004],li[400004],ri[400004];
inline void push_up(ll i) {
	sum[i]=sum[i<<1]+sum[i<<1|1];
}
inline void push_down(ll i) {
	sum[i]+=lazy[i]*(ri[i]-li[i]+1);
	if(ri[i]!=li[i]) {
		lazy[i<<1]+=lazy[i];
		lazy[i<<1|1]+=lazy[i];
		push_down(i<<1),push_down(i<<1|1);
	}
	lazy[i]=0;
}
inline void build(ll i,ll l,ll r) {
	li[i]=l,ri[i]=r;
	if(l==r)sum[i]=in[l];
	else {
		ll mid=(l+r)>>1;
		build(i<<1,l,mid),build(i<<1|1,mid+1,r);
		push_up(i);
	}
}
inline void add(ll i,ll l,ll r,ll k) {
	if(l<=li[i]&&ri[i]<=r)lazy[i]+=k;
	else {
		if(li[i<<1]<=l&&ri[i<<1]>=l)add(i<<1,l,r,k);
		if(li[i<<1|1]<=r&&ri[i<<1|1]>=r)add(i<<1|1,l,r,k);
	}
}
inline ll query(ll i,ll l,ll r) {
	push_down(i);
	if(l<=li[i]&&ri[i]<=r) {
		return sum[i];
	} else {
		ll res=0;
		if(li[i<<1]<=l&&ri[i<<1]>=l)res+=query(i<<1,l,r);
		if(li[i<<1|1]<=r&&ri[i<<1|1]>=r)res+=query(i<<1|1,l,r);
		return res;
	}
}
int main() {
	cin>>n>>m;
	for(ll i=1; i<=n; ++i)cin>>in[i];
	build(1,1,n);
	ll type,l,r,k;
	for(ll i=0; i<m; ++i) {
		cin>>type>>l>>r;
		if(type==1) {
			cin>>k;
			add(1,l,r,k);
		} else {
			cout<<query(1,l,r)<<endl;
		}
	}
}
2021/10/5 10:23
加载中...