#include <bits/stdc++.h>
using namespace std;
void IO();
const long long mod = 1e9 + 7;
long long n, q;
struct node {
  long long left, right, cl, cr, tot, len;
  node() { left = right = cl = cr = tot = len = 0; }
  void nodeUpdate(long long y) {
    left = right = y;
    cl = cr = 1;
    len = 1;
    tot = 1;
  }
  void nodeUpdate(node &l, node &r) {
    cl = l.cl;
    cr = r.cr;
    len = l.len + r.len;
    left = l.left;
    right = r.right;
    tot = 0;
    tot += l.tot;
    tot += r.tot;
    if (l.right <= r.left) {
      long long x = (l.cr + r.cl);
      tot += x * (x + 1) / 2;
      tot -= l.cr * (l.cr + 1) / 2 + r.cl * (r.cl + 1) / 2;
      if (l.len == l.cl) {
        cl = l.len + r.cl;
      }
      if (r.len == r.cl) {
        cr = r.len + l.cr;
      }
    }
  }
};
struct tree {
  long long n;
  vector<node> v;
  tree(vector<long long> &ar) {
    n = ar.size();
    v.resize(4 * n + 8);
    buildTree(1, 1, n, ar);
  }
  void buildTree(long long root, long long l, long long r,
                 vector<long long> &ar) {
    if (l == r) {
      v[root].nodeUpdate(ar[l - 1]);
      return;
    }
    long long mid = (l + r) / 2;
    buildTree(root * 2, l, mid, ar);
    buildTree(root * 2 + 1, mid + 1, r, ar);
    v[root].nodeUpdate(v[root * 2], v[root * 2 + 1]);
  }
  void Update(long long root, long long l, long long r, long long ind,
              long long val) {
    if (r < ind || ind < l) return;
    if (l == r) {
      v[root].nodeUpdate(val);
      return;
    }
    long long mid = (l + r) / 2;
    if (ind <= mid)
      Update(root * 2, l, mid, ind, val);
    else
      Update(root * 2 + 1, mid + 1, r, ind, val);
    v[root].nodeUpdate(v[root * 2], v[root * 2 + 1]);
  }
  node query(long long root, long long l, long long r, long long x,
             long long y) {
    node temp;
    if (x > r || y < l) return temp;
    if (x <= l && r <= y) return v[root];
    long long mid = (l + r) / 2;
    node left = query(root * 2, l, mid, x, y);
    node right = query(root * 2 + 1, mid + 1, r, x, y);
    temp.nodeUpdate(left, right);
    return temp;
  }
  void Update(long long ind, long long val) { Update(1, 1, n, ind, val); }
  long long query(long long x, long long y) { return query(1, 1, n, x, y).tot; }
};
void solve() {
  cin >> n >> q;
  vector<long long> ar(n);
  for (long long &x : ar) cin >> x;
  tree t(ar);
  while (q--) {
    long long x, y, z;
    cin >> x >> y >> z;
    if (x == 1) {
      t.Update(y, z);
    } else {
      cout << t.query(y, z) << "\n";
    }
  }
}
int32_t main() {
  IO();
  long long t = 1;
  while (t--) {
    solve();
  }
}
void IO() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
}
