#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,tune=native")
template <typename T>
void print(T&& x) {
  cout << x << "\n";
}
template <typename T, typename... S>
void print(T&& x, S&&... y) {
  cout << x << ' ';
  print(y...);
}
const long long Mod = 1000000007, Mod2 = 998244353;
const long long MOD = Mod2;
const long long maxn = 200005;
struct segment_tree {
  vector<long long> val, tag;
  long long type;
  inline long long mid(long long l, long long r) { return l + r >> 1; }
  segment_tree(long long _siz, long long _type) {
    val.resize(4 * _siz), tag.resize(4 * _siz), type = _type;
  }
  inline long long oper(long long i, long long j) {
    if (type == 0)
      return i + j;
    else if (type == 1)
      return min(i, j);
    else
      return max(i, j);
  }
  inline long long def() {
    if (type == 0)
      return 0;
    else if (type == 1)
      return 4e18;
    else
      return -4e18;
  }
  void pull(long long k) { val[k] = oper(val[k << 1], val[(k << 1) + 1]); }
  void push(long long k, long long l, long long r) {
    if (l != r) {
      if (type) {
        tag[k << 1] += tag[k];
        tag[(k << 1) + 1] += tag[k];
        val[k << 1] += tag[k];
        val[(k << 1) + 1] += tag[k];
      } else {
        tag[k << 1] += tag[k];
        tag[(k << 1) + 1] += tag[k];
        val[k << 1] += (mid(l, r) - l + 1) * tag[k];
        val[(k << 1) + 1] += (r - mid(l, r)) * tag[k];
      }
    }
    tag[k] = 0;
  }
  void modify(long long k, long long l, long long r, long long ql, long long qr,
              long long x) {
    if (l > qr || r < ql) return;
    if (ql <= l && qr >= r) {
      if (type)
        val[k] += x;
      else
        val[k] += (r - l + 1) * x;
      tag[k] += x;
      return;
    }
    push(k, l, r);
    modify(k << 1, l, mid(l, r), ql, qr, x);
    modify((k << 1) + 1, mid(l, r) + 1, r, ql, qr, x);
    pull(k);
  }
  long long query(long long k, long long l, long long r, long long ql,
                  long long qr) {
    if (l > qr || r < ql) return def();
    if (ql <= l && qr >= r) return val[k];
    push(k, l, r);
    return oper(query(k << 1, l, mid(l, r), ql, qr),
                query((k << 1) + 1, mid(l, r) + 1, r, ql, qr));
  }
};
long long n, q, a[maxn];
segment_tree segtree(maxn, 0);
set<long long> st;
void add(long long x) {
  auto it = st.lower_bound(x);
  long long l = *prev(it), r = *it;
  segtree.modify(1, 0, n - 1, x, r - 1, -(x - l));
  st.insert(x);
}
void sub(long long x) {
  st.erase(x);
  auto it = st.lower_bound(x);
  long long l = *prev(it), r = *it;
  826;
  segtree.modify(1, 0, n - 1, x, r - 1, x - l);
}
void orzck() {
  cin >> n >> q;
  for (long long i = (0); i < ((long long)(n)); i++) cin >> a[i];
  st.insert(0);
  for (long long i = (0); i < ((long long)(n - 1)); i++)
    if (a[i + 1] < a[i]) st.insert(i + 1);
  st.insert(n);
  long long cur = 1;
  for (long long i = (0); i < ((long long)(n)); i++) {
    cur++;
    if (st.count(i)) cur = 1;
    segtree.modify(1, 0, n - 1, i, i, cur);
    826;
  }
  826;
  while (q--) {
    long long op;
    cin >> op;
    if (op == 1) {
      long long p, x;
      cin >> p >> x;
      p--;
      a[p] = x;
      if (p && a[p] < a[p - 1] && !st.count(p)) add(p), 826;
      if (p && a[p] >= a[p - 1] && st.count(p)) sub(p), 826;
      if (p < n - 1 && a[p + 1] < a[p] && !st.count(p + 1)) add(p + 1), 826;
      if (p < n - 1 && a[p + 1] >= a[p] && st.count(p + 1)) sub(p + 1), 826;
    } else {
      long long l, r;
      cin >> l >> r;
      l--, r--;
      bool flag = 0;
      if (!st.count(l)) add(l), flag = 1;
      826;
      print(segtree.query(1, 0, n - 1, l, r));
      if (flag) sub(l);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cout << fixed << setprecision(15);
  long long t;
  t = 1;
  while (t--) orzck();
  return 0;
}
