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));
	}
}