Link to this code:
https://cses.fi/paste/b1f94eda33514b6d10315e/#include<bits/stdc++.h>
// #include<ext/pb_ds/assoc_container.hpp>
// #include<ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
#define ll long long int
#define read(m) scanf("%lld",&m)
#define print(m) printf("%lld\n",m)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define input freopen("input.txt","r",stdin),freopen("output.txt","w",stdout)
// template<class T> using oset =tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
const ll mxN=2e5;
ll arr[mxN];
ll n;
struct node{
ll prefixSum;
ll suffixSum;
ll totalSum;
ll maxSum;
void assign(ll val)
{
prefixSum=val;
suffixSum=val;
totalSum=val;
maxSum=val;
}
};
node tree[4*mxN+1];
node merge(node left,node right)
{
node t;
t.prefixSum=max(left.prefixSum,right.prefixSum+left.totalSum);
t.suffixSum=max(left.suffixSum+right.totalSum,right.suffixSum);
t.totalSum=left.totalSum+right.totalSum;
t.maxSum=max(max(left.maxSum,right.maxSum),left.suffixSum+right.prefixSum);
return t;
}
void buildTree(ll s=0,ll e=n-1,ll idx=1)
{
if(s>e)
return;
if(s==e)
{
tree[idx].assign(arr[s]);
return;
}
ll m=(s+e)>>1;
buildTree(s,m,2*idx);
buildTree(m+1,e,2*idx+1);
tree[idx]=merge(tree[2*idx],tree[2*idx+1]);
}
void pointUpdate(ll pos,ll val,ll s=0,ll e=n-1,ll idx=1)
{
if(s==e)
{
tree[idx].assign(val);
return;
}
else
{
ll m=(s+e)>>1;
if(pos>=s and pos<=m)
pointUpdate(pos,val,s,m,2*idx);
else
pointUpdate(pos,val,m+1,e,2*idx+1);
tree[idx]=merge(tree[2*idx],tree[2*idx+1]);
}
}
node rangeQuery(ll qs,ll qe,ll s=0,ll e=n-1,ll idx=1)
{
node t;
if(s>e or s>qe or qs>e)
{
t.assign(INT_MIN);
t.totalSum=0;
return t;
}
else if(qs<=s and e<=qe)
{
return tree[idx];
}
else
{
ll m=(s+e)>>1;
auto left=rangeQuery(qs,qe,s,m,2*idx);
auto right=rangeQuery(qs,qe,m+1,e,2*idx+1);
tree[idx]=merge(left,right);
return tree[idx];
}
}
int main()
{
fast;
// input;
read(n);
ll m;
read(m);
for(ll i=0;i<n;i++)
read(arr[i]);
buildTree();
while(m--)
{
ll k,x;
read(k),read(x);
pointUpdate(k-1,x);
print(max(0ll,rangeQuery(0,n-1).maxSum));
}
}