刚学线段树,求调
查看原帖
刚学线段树,求调
705296
miffy_123楼主2024/3/13 21:01
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 2147483646
#define inf 9223372036854775806
#define pl putchar('\n');
const ll mxn=100005;
struct lt{
	ll l,r,sum;
	ll lazy_tag;
}t[4*mxn]; 
ll a[mxn];
void build(ll p,ll l,ll r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
	return;
}
void change(ll p,ll l,ll r,ll v){
	if(t[p].l>r||t[p].r<l){
		return;
	}
	if(l<=t[p].l&&r>=t[p].r){
		t[p].sum+=(t[p].r-t[p].l+1)*t[p].lazy_tag;
		t[p].lazy_tag+=v;
		return;
	}
	if(t[p].lazy_tag!=0){
		t[p*2].sum+=(t[p*2].r-t[p*2].l+1)*t[p].lazy_tag;
		t[p*2+1].sum+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].lazy_tag;
		t[p*2].lazy_tag+=t[p].lazy_tag;
		t[p*2+1].lazy_tag+=t[p].lazy_tag;
		t[p].lazy_tag=0;
	}
	ll mid=(t[p].l+t[p].r)/2;
	if(mid>=l){
		change(p*2,l,r,v);
	}
	if(mid<=r){
		change(p*2+1,l,r,v);
	}
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
	return;
}
ll ask(ll p,ll l,ll r){
	if(t[p].l>r||t[p].r<l){
		return 0;
	}
	if(l<=t[p].l&&r>=t[p].r){
		return t[p].sum;
	}
	if(t[p].lazy_tag!=0){
		t[p*2].sum+=(t[p*2].r-t[p*2].l+1)*t[p].lazy_tag;
		t[p*2+1].sum+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].lazy_tag;
		t[p*2].lazy_tag+=t[p].lazy_tag;
		t[p*2+1].lazy_tag+=t[p].lazy_tag;
		t[p].lazy_tag=0;
	}
	ll mid=(t[p].l+t[p].r)/2;
	ll ret=0;
	if(mid>=l){
		ret+=ask(p*2,l,r);
	}
	if(mid<r){
		ret+=ask(p*2+1,l,r);
	}
	return ret;
}
ll n,m;
int main(){
    cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
	} 
	build(1,1,n);
	while(m--){
		ll opt;
		cin>>opt;
		if(opt==1){
			ll x,y,k;
			cin>>x>>y>>k;
			change(1,x,y,k);
		}
		else{
			ll x,y;
			cin>>x>>y;
			cout<<ask(1,x,y)<<endl;
		}
	}
    return 0;
}


2024/3/13 21:01
加载中...