#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct Fenwink_Tree {
  vector<long long> bit;
  Fenwink_Tree(int n) : bit(n + 1, 0) {}
  long long query(int x) {
    long long ans = 0;
    for (int i = x; i >= 1; i -= i & (-i)) ans += bit[i];
    return ans;
  }
  void update(int x, long long val) {
    int n = bit.size() - 1;
    for (int i = x; i <= n; i += i & (-i)) bit[i] += val;
  }
};
set<long long> s;
int a[N];
long long cal(long long x) { return x * (x + 1) / 2; }
void del(int x, Fenwink_Tree& T) {
  auto it = s.find(x);
  T.update(x, -cal(x - *prev(it)));
  T.update(*next(it), -cal(*next(it) - x));
  T.update(*next(it), cal(*next(it) - *prev(it)));
  s.erase(it);
}
void add(int x, Fenwink_Tree& T) {
  s.insert(x);
  auto it = s.find(x);
  T.update(*next(it), -cal(*next(it) - *prev(it)));
  T.update(*next(it), cal(*next(it) - x));
  T.update(x, cal(x - *prev(it)));
}
inline void solve() {
  int n, q;
  cin >> n >> q;
  Fenwink_Tree T(n);
  int last = 0;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) {
    if (a[i] > a[i + 1] || i == n) {
      T.update(i, cal(i - last));
      last = i;
      s.insert(i);
    }
  }
  s.insert(0), s.insert(n + 1);
  for (int i = 1; i <= q; i++) {
    int op, x, y;
    cin >> op >> x >> y;
    if (op == 1) {
      if (a[x - 1] > a[x]) del(x - 1, T);
      if (a[x] > a[x + 1]) del(x, T);
      a[x] = y;
      if (a[x - 1] > a[x]) add(x - 1, T);
      if (a[x] > a[x + 1]) add(x, T);
    } else {
      auto it = s.lower_bound(x);
      if (*it >= y) {
        cout << cal(y - x + 1) << endl;
        continue;
      }
      auto it1 = prev(s.upper_bound(y));
      long long ans = cal(*it - x + 1);
      ans += T.query(*it1) - T.query(*it);
      ans += cal(y - *it1);
      cout << ans << endl;
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
