本蒟蒻连数据点都过不了……
查看原帖
本蒟蒻连数据点都过不了……
1046223
a_blue_fool楼主2024/3/22 22:01

感谢大佬!!!

#include <bits/stdc++.h>
#define ll long long

using namespace std;

ll n , m , in[2000001] , tree[2000001] , marks[2000001] , a , x , y , k;

inline ll ls (ll x)
{
	return x<<1;
}

inline ll rs (ll x)
{
	return (x<<1)+1;
}

inline void push_up (ll root)
{
	tree[root] += tree[ls(root)] + tree[rs(root)];
	
	return;
}

void build (ll root , ll l , ll r)
{
	if (l == r)
	{
		tree[root] = in[l];
		return;
	}
	
	ll mid = (l+r)>>1;
	build (ls(root) , l , mid);
	build (rs(root) , mid+1 , r);
	push_up(root);
	
	return;
}

inline void mark (ll root , ll l , ll r , ll data)
{
	marks[root] = data;
	tree[root] = tree[root]+data*(r-l+1);
	
	return;
}

inline void push_down (ll root , ll l , ll r)
{
	ll mid = (l+r)>>1;
	mark (ls(root) , l , mid , marks[root]);
	mark (rs(root) , mid+1 , r , marks[root]);
	marks[root] = 0;
	
	return;
}

inline void update (ll ans_l , ll ans_r , ll l , ll r , ll root , ll data)
{
	if (ans_l <= l && ans_r >= r)
	{
		tree[root] += data*(r-l+1);
		marks[root] += data;
		return;
	}
	
	push_down(root , l , r);
	
	ll mid = (l+r)>>1;
	if (ans_l <= mid) update(ans_l , ans_r , l , mid , ls(root) , data);
	if (ans_r > mid) update(ans_l , ans_r , mid+1 , r , rs(root) , data);
	
	push_up(root);
	return;
}

ll ans (ll ans_l , ll ans_r , ll l , ll r , ll root)
{
	ll ans_ = 0;
	if (ans_l <= l && ans_r >= r) return tree[root];
	
	ll mid = (l+r)>>1;
	push_down (root , l , r);
	
	if (ans_l <= mid) ans_ += ans(ans_l , ans_r , l , mid , ls(root));
	if (ans_r > mid) ans_ += ans(ans_l , ans_r , mid+1, r , rs(root));
	
	return ans_;
}

int main()
{
	scanf("%lld%lld" , &n , &m);
	
	for (ll i = 1 ; i <= n ; i++) scanf("%lld" , &in[i]);
	build (1 , 1 , n);
	
	for (ll i = 1 ; i <= m ; i++)
	{
		scanf("%lld" , &a);
		if (a == 1)
		{
			scanf("%lld%lld%lld" , &x , &y , &k);
			update (x , y , 1 , n , 1 , k);
		}
		else
		{
			scanf("%lld%lld" , &x , &y);
			printf("%lld\n" , ans(x , y , 1 , n , 1));
		}
	}
	
	return 0;
}
2024/3/22 22:01
加载中...