#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) {
  if (b > a) return gcd(b, a);
  return (b == 0) ? a : gcd(b, a % b);
}
int bitcount(long long a) {
  int i;
  for (i = 0; a > 0; i++) a &= (a - 1);
  return i;
}
int a[300005], b[4 * 300005], d[3 * 100005];
void tree(int n, int s, int e) {
  if (s == e) {
    if (a[s] < a[s - 1])
      b[n] = 1;
    else
      b[n] = 0;
    return;
  }
  int m = (s + e) / 2;
  tree(2 * n, s, m);
  tree(2 * n + 1, m + 1, e);
  b[n] = b[2 * n] + b[2 * n + 1];
  return;
}
int query(int n, int s, int e, int p1, int p2) {
  if (s > p2 || e < p1) return 0;
  if (s >= p1 && e <= p2) return b[n];
  int m = (s + e) / 2;
  return query(2 * n, s, m, p1, p2) + query(2 * n + 1, m + 1, e, p1, p2);
}
void update(int n, int s, int e, int p) {
  if (s == p && e == p) {
    if (a[s] < a[s - 1])
      b[n] = 1;
    else
      b[n] = 0;
    return;
  }
  int m = (s + e) / 2;
  if (p <= m)
    update(2 * n, s, m, p);
  else
    update(2 * n + 1, m + 1, e, p);
  b[n] = b[2 * n] + b[2 * n + 1];
  return;
}
int main() {
  int n, q, i, j, k;
  cin >> n;
  a[0] = 0;
  for (i = 1; i <= n; i++) {
    cin >> d[i];
    a[d[i]] = i;
  }
  tree(1, 1, n);
  cin >> q;
  while (q--) {
    cin >> i >> j >> k;
    if (i == 1) {
      cout << query(1, 1, n, j + 1, k) + 1 << endl;
    } else {
      swap(d[j], d[k]);
      a[d[j]] = j;
      a[d[k]] = k;
      update(1, 1, n, d[j]);
      update(1, 1, n, d[k]);
      if (d[k] != n) update(1, 1, n, d[k] + 1);
      if (d[j] != n) update(1, 1, n, d[j] + 1);
    }
  }
  return 0;
}
