大佬球球了线段树模版求调
查看原帖
大佬球球了线段树模版求调
614780
H2130823062楼主2024/3/30 21:16
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 400009;
ll n , q , x , y ,z;
ll a[N];
string s;
struct E
{
	ll l , r , mm,sum,lz;
}e[N*4 + 10];
void build(ll h,ll l,ll r)
{
	e[h].l = l;
	e[h].r = r;
	e[h].mm = N;
	e[h].lz = 0;
	if(l == r)
	{
		e[h].sum = a[l];
		e[h].mm = a[l];
		return ;
	}
	ll mid = (l + r) / 2;
	build(h*2,l,mid);
	build(h*2+1 , mid+1, r);
	e[h].sum = e[h*2].sum + e[h*2+1].sum;
	e[h].mm = min(e[h*2].mm , e[h*2+1].mm);
}
void down(ll h)
{
	if(e[h].lz)
	{
		e[h*2].sum += (ll)(e[h*2].r - e[h*2].l+1)*e[h].lz;
		e[h*2].mm += e[h].lz;
		
		e[h*2+1].sum += (ll)(e[h*2+1].r - e[h*2+1].l+1)*e[h].lz;
		e[h*2+1].mm += e[h].lz;
		
		e[h*2].lz += e[h].lz;
		e[h*2+1].lz += e[h].lz;
		
		e[h].lz = 0;
	}
}
void addnum(ll h , ll l , ll r , ll num)
{
	
	if(e[h].l >= l && e[h].r <= r)
	{
		e[h].sum += (e[h].r-e[h].l+1) * num;
		//cout<<":"<<e[h].sum<<endl;
		e[h].mm += num;
		e[h].lz = num;
		return ;
	}
	down(h);
	ll mid = (e[h].l + e[h].r) / 2;
	if(l <= mid)
	{
		addnum(h*2 , l , r , num);
	}
	if(mid+1 <= r)
	{
		addnum(h*2+1, l , r , num);
	}
	e[h].sum = e[h*2].sum + e[h*2+1].sum;
	e[h].mm = min(e[h*2].mm , e[h*2+1].mm);
}

ll finds(ll h ,ll l , ll r)
{
	if(e[h].l >= l && e[h].r <= r)
	{
		return e[h].sum;
	}
	down(h);
	ll mid = (e[h].l + e[h].r) / 2;
	ll ans = 0;
	if(mid >= l)
	{
		ans += finds(h*2 , l , r);
	}
	if(mid+1 <= r)
	{
		ans += finds(h*2+1 , l , r);
	}
	return ans;
}
ll findm(ll h,ll l , ll r)
{
	if(e[h].l >= l && e[h].r <= r)
	{
		return e[h].mm;
	}
	down(h);
	ll ans = 0x3f3f3f3f;
	ll mid = (e[h].l + e[h].r) / 2;
	if(mid >= l)
	{
		ans = min(ans , findm(h*2 , l , r) );
	}
	if(mid + 1 <= r)
	{
		ans = min (ans , findm(h*2+1, l , r) );
	}
	return ans;
}
signed main()
{
	
	//ios::sync_with_stdio(0);
	//cin >> n >> q;
	scanf("%lld %lld",&n , &q);
	for(ll i=1; i <= n; i++)
	{
		//cin >> a[i];
		scanf("%lld",&a[i]);
	}
	build(1 , 1 , n);
	for(ll i=1; i <= q; i++)
	{
		cin >> s;
		//scanf("%c ",s);
		if(s == "M")
		{
		    //cin >> x >> y;
		    scanf("%lld %lld",&x,&y);
			//cout<<findm(1,x,y)<<endl;
			printf("%lld\n",findm(1,x,y));
		}
		else if(s == "P")
		{
		    //cin >> x >> y >> z;
		    scanf("%lld %lld %lld" , &x,&y,&z);
			addnum(1,x , y , z);
		}
		else if(s == "S")
		{
		    //cin >> x >> y;
		    scanf("%lld %lld",&x,&y);
			//cout<<finds(1 , x , y)<<endl;
			printf("%lld\n",finds(1,x,y));
		}
		//cout<<1111<<endl;
	}
	return 0;
}

2024/3/30 21:16
加载中...