#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300005;
class BIT {
  int range;
  int *entries;

 public:
  BIT(const int &_range) : range(_range) {
    entries = new int[range + 1];
    fill(entries, entries + range + 1, 0);
  }
  ~BIT() { delete[] entries; }
  void insert(int x, int val) {
    for (int i = x; i <= range; i += i & (-i)) {
      entries[i] += val;
    }
  }
  int query(int x) {
    int res = 0;
    for (int i = x; i >= 1; i -= i & (-i)) {
      res += entries[i];
    }
    return res;
  }
  int query(int st, int ed) {
    assert(st <= ed);
    st--;
    int res_st = (st >= 1) ? query(st) : 0;
    int res_ed = (ed >= 1) ? query(ed) : 0;
    return res_ed - res_st;
  }
};
int n;
int q;
int a[MAXN];
int pos[MAXN];
int pre[MAXN];
int nxt[MAXN];
int app[MAXN];
set<int> curr_set;
BIT bit(MAXN);
void update_sub(int x) {
  if (pre[x] != -1) {
    if (pos[x] > pos[x - 1]) {
      nxt[x - 1] = pos[x];
    } else {
      nxt[x - 1] = -1;
      pre[x] = -1;
      if (curr_set.find(x) == curr_set.end()) {
        curr_set.insert(x);
        bit.insert(x, 1);
      }
    }
  }
  if (nxt[x] != -1) {
    if (pos[x + 1] > pos[x]) {
      pre[x + 1] = pos[x];
    } else {
      nxt[x] = -1;
      pre[x + 1] = -1;
      if (curr_set.find(x + 1) == curr_set.end()) {
        curr_set.insert(x + 1);
        bit.insert(x + 1, 1);
      }
    }
  }
}
void merge(int x) {
  if (pre[x] != -1 && nxt[x] != -1) return;
  if (pre[x] == -1 && x > 1) {
    if (pos[x - 1] < pos[x]) {
      pre[x] = pos[x - 1];
      nxt[x - 1] = pos[x];
      curr_set.erase(x);
      bit.insert(x, -1);
    }
  }
  if (nxt[x] == -1 && x < n) {
    if (pos[x + 1] > pos[x]) {
      pre[x + 1] = pos[x];
      nxt[x] = pos[x + 1];
      curr_set.erase(x + 1);
      bit.insert(x + 1, -1);
    }
  }
}
void update(int i, int j) {
  int x = a[i];
  int y = a[j];
  pos[x] = j;
  pos[y] = i;
  swap(a[i], a[j]);
  update_sub(x);
  update_sub(y);
  merge(x);
  merge(y);
}
int main() {
  scanf("%d", &(n));
  for (int i = 1; i <= n; i++) {
    scanf("%d", &(a[i]));
    pos[a[i]] = i;
  }
  memset((pre), -1, sizeof((pre)));
  memset((nxt), -1, sizeof((nxt)));
  memset((app), -1, sizeof((app)));
  for (int i = 1; i <= n; i++) {
    if (app[a[i]] == -1) {
      app[a[i]] = 1;
      app[a[i] + 1] = 1;
      bit.insert(a[i], 1);
    } else {
      nxt[a[i] - 1] = i;
      pre[a[i]] = pos[a[i] - 1];
      app[a[i] + 1] = 1;
    }
  }
  scanf("%d", &(q));
  while (q-- > 0) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int st, ed;
      scanf("%d%d", &st, &ed);
      int ans = bit.query(st, ed);
      if (bit.query(st, st) == 0) ans++;
      printf("%d\n", ans);
    } else {
      int i, j;
      scanf("%d%d", &i, &j);
      if (i == j) continue;
      update(i, j);
    }
  }
  return 0;
}
