#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const ll inf = (1 << 30) - 1;
const ll infll = (1LL << 61) - 1;
#define fast() cin.tie(0), ios::sync_with_stdio(false)

template <typename T1, typename T2>
inline void chmin(T1 &a, T2 b)
{
    if (a > b)
        a = b;
}
template <typename T1, typename T2>
inline void chmax(T1 &a, T2 b)
{
    if (a < b)
        a = b;
}

template <typename T, typename E>
struct SegmentTree
{
    using F = function<T(T, T)>;
    using G = function<T(T, E)>;
    ll n;
    F f;
    G g;
    T ti;
    vector<T> dat;
    SegmentTree(){};
    SegmentTree(F f, G g, T ti) : f(f), g(g), ti(ti) {}

    void init(ll n_)
    {
        n = 1;
        while (n < n_)
            n <<= 1;
        dat.assign(n << 1, ti);
    }
    void build(const vector<T> &v)
    {
        ll n_ = v.size();
        init(n_);
        for (ll i = 0; i < n_; i++)
            dat[n + i] = v[i];
        for (ll i = n - 1; i; i--)
            dat[i] = f(dat[(i << 1) | 0], dat[(i << 1) | 1]);
    }
    void update(ll k, E a)
    {
        k += n;
        dat[k] = g(dat[k], a);
        while (k >>= 1)
            dat[k] = f(dat[(k << 1) | 0], dat[(k << 1) | 1]);
    }
    void set_val(ll k, T x)
    {
        dat[k += n] = x;
        while (k >>= 1)
            dat[k] = f(dat[(k << 1) | 0], dat[(k << 1) | 1]);
    }
    T query(ll a, ll b)
    {
        T vl = ti, vr = ti;
        for (ll l = a + n, r = b + n; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1)
                vl = f(vl, dat[l++]);
            if (r & 1)
                vr = f(dat[--r], vr);
        }
        return f(vl, vr);
    }
};

struct FastIO
{
    FastIO()
    {
        cin.tie(0);
        ios::sync_with_stdio(0);
    }
} fastio_beet;

//INSERT ABOVE HERE

signed main()
{
    ll n, q;
    cin >> n >> q;

    struct T
    {
        ll va, vi, vl, vr;
        T() {}
        T(ll va, ll vi, ll vl, ll vr) : va(va), vi(vi), vl(vl), vr(vr) {}
        bool operator==(const T &a) const
        {
            return va == a.va && vi == a.vi && vl == a.vl && vr == a.vr;
        }
    };

    const ll INF = 1e15;
    T ti(-INF, -INF, -INF, -INF);
    auto f = [&](T a, T b) {
        if (a == ti)
            return b;
        if (b == ti)
            return a;
        ll cva = a.va + b.va, cvi = max(a.vi, b.vi), cvl = a.vl, cvr = b.vr;
        chmax(cvi, a.vr + b.vl);
        chmax(cvl, a.va + b.vl);
        chmax(cvr, a.vr + b.va);
        return T(cva, cvi, cvl, cvr);
    };

    auto g = [&](T a, ll b) {a.va++;return T(b,b,b,b); };

    SegmentTree<T, ll> seg(f, g, ti);
    seg.build(vector<T>(n, ti));

    vector<ll> a(n);
    for (ll i = 0; i < n; i++)
        cin >> a[i];
    for (ll i = 0; i < n; i++)
        seg.update(i, a[i]);

    for (ll i = 0; i <= q; i++)
    {
        if (i != 0)
        {
            ll k, x;
            cin >> k >> x;
            k--;
            seg.update(k, x);
        }
        ll l1 = 1, l2 = n, r1 = 1, r2 = n;
        l1--;
        r1--;
        chmin(l2, r2);
        chmax(r1, l1);
        if (l2 <= r1)
        {
            auto x = seg.query(l1, l2);
            auto y = seg.query(r1, r2);
            auto z = seg.query(l2, r1);
            ll ans = x.vr + (l2 == r1 ? 0 : z.va) + y.vl;
            cout << max(ans, 0LL) << "\n";
        }
        else
        {
            auto x = seg.query(l1, r1);
            auto y = seg.query(l2, r2);
            auto z = seg.query(r1, l2);
            ll ans = x.vr + z.va + y.vl;
            chmax(ans, z.vi);
            chmax(ans, z.vr + y.vl);
            chmax(ans, x.vr + z.vl);
            cout << max(ans, 0LL) << "\n";
        }
    }
}



Measured memory_bytes: 14188