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