Getting a segmentation fault.Using Segment tree.
Problem link- SPOJ.com - Problem KGSS
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define vi vector<>
void debugMode() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif // ONLINE_JUDGE
}
void build(vector<ll> &arr,vector<pair<ll,ll>> &tree,int s ,int e,int tidx)
{
if(s==e)
{
tree[tidx].first=arr[s];
tree[tidx].second = 0;
return;
}
int mid=(s+e)/2;
build(arr,tree,s,mid,2*tidx+1);
build(arr,tree,mid+1,e,2*tidx+2);
tree[tidx].first = max(tree[2*tidx+1].first,tree[2*tidx+2].first);
tree[tidx].second = min(max(tree[2*tidx+1].second,tree[2*tidx+2].first),max(tree[2*tidx+1].first,tree[2*tidx+2].second));
}
void update(vector<ll> &arr,vector<pair<ll,ll>> &tree,int s,int e,int tidx,int x,int val)
{
if(s==e)
{
arr[x]=val;
tree[tidx].first=val;
}
int mid=(s+e)/2;
if(x>mid)
update(arr,tree,mid+1,e,2*tidx+2,x,val);
else
update(arr,tree,s,mid,2*tidx+1,x,val);
//self-work
tree[tidx].first = max(tree[2*tidx+1].first,tree[2*tidx+2].first);
tree[tidx].second = min(max(tree[2*tidx+1].second,tree[2*tidx+2].first),max(tree[2*tidx+1].first,tree[2*tidx+2].second));
}
pair<ll,ll> query(vector<pair<ll,ll>> &tree,int s,int e,int tidx,int l,int r)
{
if(s>r or e<l){pair<ll,ll> pr(0,0); return pr ;}
if (s>=l and e<=r)
return tree[tidx];
int mid = (s+e)/2;
pair<ll,ll> ansl = query(tree,s,mid,2*tidx+1,l,r);
pair<ll,ll> ansr = query(tree,mid+1,e,2*tidx+2,l,r);
pair<ll,ll> ans;
ans.first = max(ansl.first,ansr.first);
ans.second = max(ansl.second,ansr.second);
return ans;
}
int main()
{
debugMode();
int n,q;
cin>>n;
vector<ll> arr(n);
for(int i=0;i<n;i++) { int m;cin>>m;arr.push_back(m);}
vector<pair<ll,ll>> segtree(4*n);
cin>>q;
build(arr,segtree,0,n-1,0);
while(q--)
{
char type;
cin>>type;
if(type=='U')
{
int val;
int x;
cin>>x>>val;
update(arr,segtree,0,n-1,0,x-1,val);
}
else
{
int l,r;
cin>>l>>r;
//pair<ll,ll> sum;
auto sum = query(segtree,0,n-1,0,l-1,r-1);
cout<<sum.first+sum.second<<"\n";
}
}
return 0;
}