KGSS - Maximum Sum - SPOJ Solution C++

  Problem Link : KGSS 


👉 Hint : edit please

 


✅ C++ Solution :

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

#define ll long long int

pair<ll,ll> st[400001];
ll arr[100001];

void build(int v, int s, int e)
{
	if(s==e)
	{
		st[v]=make_pair(arr[s],-1);
		return ;
	}

	int mid=(s+e)/2;
	build(2*v,s,mid);
	build(2*v+1,mid+1,e);

	vector<ll> vec;
	vec.push_back(st[2*v].first);
	vec.push_back(st[2*v+1].first);
	vec.push_back(st[2*v].second);
	vec.push_back(st[2*v+1].second);
	sort(vec.begin(),vec.end(),greater<ll>());
	st[v]=make_pair(vec[0],vec[1]);
}

void update(int v,int l, int r,int ind, int value)
{
	if(l==r)
	{
		st[v].first=value;
		return;
	}

	int mid=(l+r)/2;
	if(ind>=l && ind<=mid)
		update(2*v,l,mid,ind,value);
	else
		update(2*v+1,mid+1,r,ind,value);

	vector<ll> vec;
	vec.push_back(st[2*v].first);
	vec.push_back(st[2*v+1].first);
	vec.push_back(st[2*v].second);
	vec.push_back(st[2*v+1].second);
	sort(vec.begin(),vec.end(),greater<ll>());
	st[v]=make_pair(vec[0],vec[1]);

}

pair<ll,ll> query(int v, int s, int e, int l, int r)
{
 
	if(s>r || e<l)
		return make_pair(-1,-1);
	if(s>=l && e<=r)
		return st[v];

	int mid=(s+e)/2;
	pair<int,int> p,q;
	p=query(2*v,s,mid,l,r);
	q=query(2*v+1,mid+1,e,l,r);
	"<<q.second<<endl;
	vector<ll> vec;
	vec.push_back(p.first);
	vec.push_back(q.first);
	vec.push_back(p.second);
	vec.push_back(q.second);
	sort(vec.begin(),vec.end(),greater<ll>());
	
	return make_pair(vec[0],vec[1]);
}

int main()
{
	int n,q,l,r;
	char c;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>arr[i];

	build(1,1,n);
	
	cin>>q;
	while(q--)
	{
		cin>>c>>l>>r;

		if(c=='Q')
        {
			pair<ll,ll> p=query(1,1,n,l,r);
			cout<<p.first+p.second<<"\n";
        }
		else
        {
			update(1,1,n,l,r);
        }
	}

}

 

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!!