蒟蒻刚学线段树,求调
查看原帖
蒟蒻刚学线段树,求调
785957
miaoborui123456789楼主2024/12/8 21:52

QWQ

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 1e6 + 7;
ll n , m;

ll num[N];
ll tree[4*N];
ll lazy[4*N];

void build(ll s , ll t , ll p){
	if(s == t){
		tree[p] = num[s];
		return ;
	}
	ll mid = s + ((t-s) >> 1);
	build(s , mid , p * 2) , build(mid + 1 , t , (p * 2) + 1);
	tree[p] = tree[p * 2] + tree[(p * 2) + 1];
}

void push_down(ll root, ll L, ll R) {
    if (lazy[root]) {
        lazy[root * 2] += lazy[root];
        lazy[root * 2 + 1] += lazy[root];
        ll mid = L + ((R-L)>>1);
        tree[root * 2] += lazy[root] * (mid - L + 1);
        tree[root * 2 + 1] += lazy[root] * (R - mid);
        lazy[root] = 0;
    }
}

ll get_sum(ll l , ll r , ll s , ll t , ll p){
	if(l <= s && t <= r){
		return tree[p];
	}

	ll mid = s + ((t-s) >> 1);
	push_down(p,l ,r);
	ll sum = 0;
	if(l <= mid){
		sum += get_sum(l , r , s , mid , p * 2);
	}
	if(r > mid){
		sum += get_sum(l , r , mid + 1 , t , p * 2 + 1);
	}
	return sum;
}

void update(ll l , ll r , ll s , ll t , ll c , ll p){
	if(l <= s && t <= r){
		tree[p] = (t-s + 1)*c;
		lazy[p] += c;
		return ;
	}
	
	ll mid = s + ((t-s) >> 1);
	push_down(p,l ,r);
	if(l <= mid){
		update(l , r , s , mid , c , p * 2);
	}
	if(r > mid){
		update(l , r , mid + 1 , t , c , p * 2 + 1);
	}
	return ;
}

int main(){
	cin>>n>>m;
	for(int i = 1 ; i <= n ; i++){
		cin>>num[i];
	}
	build(1,n,1);
//	for(int i = 1 ; i <= n ; i++){
//		cout<<tree[i]<<" ";
//	}
	while(m--){
		ll opt;
		cin>>opt;
		if(opt == 1){
			ll x , y , k;
			cin>>x>>y>>k;
			update(x,y,1,n,k,1);
//			update(x,y,1,n,k,1);
		}else{
			ll x , y;
			cin>>x>>y;
			cout<<get_sum(x,y,1,n,1);
			puts("");
		}
	}
	return 0;
}

2024/12/8 21:52
加载中...