COURAGE - Living with Courage - SPOJ Solution C++

  Problem Link : COURAGE 


👉 Hint : edit please

 


✅ C++ Solution :

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

#define ll long long int
#define mp make_pair
#define mx pow(10,9)+1

pair<ll,ll> st[400002];
ll arr[200001];

void build(ll v, ll s, ll e)
{
	if(s==e)
	{
		st[v]=mp(arr[s],arr[s]);
		return;
	}
	ll mid=(s+e)/2;
	build(2*v,s,mid);
	build(2*v+1,mid+1,e);

	st[v]=mp(min(st[2*v].first,st[2*v+1].first),st[2*v].second+st[2*v+1].second);
}

void update(ll v, ll s, ll e, ll ind, ll x)
{
	if(s==e)
	{
		st[v].second+=x;
		st[v].first+=x;
		return;
	}

	ll mid=(s+e)/2;
	if(ind>=s && ind<=mid)
		update(2*v,s,mid,ind,x);
	else
		update(2*v+1,mid+1,e,ind,x);

	st[v]=mp(min(st[2*v].first,st[2*v+1].first),st[2*v].second+st[2*v+1].second);
}

pair<ll,ll> query(ll v, ll s, ll e, ll l, ll r)
{
	if(s>r || e< l)
		return mp(mx,0);
	if(s>=l && e<=r)
		return st[v];

	ll mid=(s+e)/2;
	pair<ll,ll> p = query(2*v,s,mid,l,r);
	pair<ll,ll> q= query(2*v+1,mid+1,e,l,r);

	return mp(min(p.first,q.first),p.second+q.second);
}

int main()
{
	ll p,n;
	cin>>n;
	for(ll i=0;i<n;i++)
		cin>>arr[i];
	cin>>p;

	build(1,0,n-1);
	string s;
	ll x,y;
	while(p--)
	{
		cin>>s>>x>>y;
		if(s=="COUNT")
		{
			pair<ll,ll> p=query(1,0,n-1,x,y);
			cout<<p.second-p.first<<"\n";
		}
		else if(s=="GROW")
			update(1,0,n-1,y,x);
		else
			update(1,0,n-1,y,x*-1);
	}
}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!