OI XXXII - piw

// https://szkopul.edu.pl/problemset/problem/SSCZFOeuhe8_DNgsgFo9moDz/site/?key=statement

// Przyjaciele i wrogowie

#include <bits/stdc++.h>

// using namespace std;

// #define GARY_DBG
#define GARY_LIB

#define int long long

constexpr int sizik = 500 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

ar<int, sizik> a, l, r, alfa, beta;

std::bitset<sizik> delete_badboy;
int n, m;

namespace seg_tree {

int d[4 * sizik];
int lazy[4 * sizik];

void push(int v, int tl, int tr) {
    if (lazy[v] != 0 && tl != tr) {
        int addv = lazy[v];
        int left = v << 1, right = v << 1 | 1;
        d[left] += addv;
        d[right] += addv;
        lazy[left] += addv;
        lazy[right] += addv;
        lazy[v] = 0;
    } else if (tl == tr) {
        lazy[v] = 0;
    }
}

void update(int v, int tl, int tr, int l, int r, int val) {
    if (l > r) return;
    if (l == tl && r == tr) {
        d[v] += val;
        lazy[v] += val;
    } else {
        push(v, tl, tr);
        int tm = (tl + tr) >> 1;
        if (r <= tm)
            update(v << 1, tl, tm, l, r, val);
        else if (l > tm)
            update(v << 1 | 1, tm + 1, tr, l, r, val);
        else {
            update(v << 1, tl, tm, l, tm, val);
            update(v << 1 | 1, tm + 1, tr, tm + 1, r, val);
        }
        d[v] = std::max(d[v << 1], d[v << 1 | 1]);
    }
}

int query(int v, int tl, int tr, int l, int r) {
    if (l > r) return INT64_MIN;
    if (l == tl && r == tr) {
        return d[v];
    }
    push(v, tl, tr);
    int tm = (tl + tr) >> 1;
    if (r <= tm)
        return query(v << 1, tl, tm, l, r);
    else if (l > tm)
        return query(v << 1 | 1, tm + 1, tr, l, r);
    else
        return std::max(query(v << 1, tl, tm, l, tm), query(v << 1 | 1, tm + 1, tr, tm + 1, r));
}

void add(int l, int r, int delta) {
    if (l < 1) l = 1;
    if (r > n + 2) r = n + 2;
    if (l > r) return;
    update(1, 1, n + 2, l, r, delta);
}

int get_max(int l, int r) {
    if (l < 1) l = 1;
    if (r > n + 2) r = n + 2;
    if (l > r) return INT64_MIN;
    return query(1, 1, n + 2, l, r);
}

}

bool is_in(int x, int y, int z, int q) {
    assert(x <= y && z <= q);
    // z -> x -> y -> q
    return z <= x && y <= q;
}

struct Event {
    bool d;
    int x, y;
    int w;
    int k;

    Event(bool d1, int x1, int y1, int w1, int k1) : d(d1), x(x1), y(y1), w(w1), k(k1) {}
};

std::vector<Event> events;

void solve() {
    std::cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
        l[i] = r[i] = i;
        alfa[i] = 0;
        beta[i] = n + 1;
    }

    for (int i = 1; i <= m; i++) {
        int t, x, y;
        std::cin >> t >> x >> y;
        if (x == y) continue;

        if (t == 1) {
            if (y > x) {
                r[x] = std::max(r[x], y);
            } else {
                l[x] = std::min(l[x], y);
            }
        } else {
            assert(t == 2);
            if (y > x) {
                beta[x] = std::min(beta[x], y);
            } else {
                alfa[x] = std::max(alfa[x], y);
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        if (!is_in(l[i], r[i], alfa[i], beta[i])) {
            delete_badboy[i] = true;
        } else {
            events.push_back({0, alfa[i], l[i] - 1, a[i], r[i]});
            events.push_back({1, alfa[i], l[i] - 1, a[i], beta[i]});
        }
    }

    std::sort(events.begin(), events.end(), [](const Event& x, const Event& y) {
        if (x.k == y.k) return x.d < y.d;
        return x.k < y.k;
    });

    int idx = 0;
    const int NN = (int)events.size();

    // licz dp
    for (int i = 2; i <= n + 1; i++) {
        while (idx < NN && (events[idx].k == (i - 1))) {
            if (events[idx].d == 0) {
                seg_tree::add(events[idx].x + 1, events[idx].y + 1, events[idx].w);
            } else {
                seg_tree::add(events[idx].x + 1, events[idx].y + 1, -events[idx].w);
            }
            idx++;
        }

        int wyn = std::max(seg_tree::get_max(1, i - 1), 0ll);
        seg_tree::add(i, i, wyn);
    }

    int ans = seg_tree::get_max(n + 1, n + 1);
    std::cout << ans << std::endl;
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}