#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 50;
const int INF = 0x3f3f3f3f;
int a[maxn], id[maxn];
struct node {
  int l, r, sum;
} tree[maxn << 2];
void push_up(int i) { tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum; }
void build(int i, int l, int r) {
  tree[i].l = l;
  tree[i].r = r;
  tree[i].sum = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(i << 1, l, mid);
  build(i << 1 | 1, mid + 1, r);
  push_up(i);
}
void updata(int i, int x, int k) {
  if (tree[i].l == tree[i].r && tree[i].l == x) {
    tree[i].sum = k;
    return;
  }
  int mid = (tree[i].l + tree[i].r) >> 1;
  if (x <= mid)
    updata(i << 1, x, k);
  else
    updata(i << 1 | 1, x, k);
  push_up(i);
}
int query(int i, int x, int y) {
  if (tree[i].l >= x && tree[i].r <= y) return tree[i].sum;
  int mid = (tree[i].l + tree[i].r) >> 1;
  if (y <= mid)
    return query(i << 1, x, y);
  else if (x > mid)
    return query(i << 1 | 1, x, y);
  else
    return query(i << 1, x, mid) + query(i << 1 | 1, mid + 1, y);
}
int main() {
  int n;
  scanf("%d", &n);
  memset(id, 0, sizeof(id));
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    id[a[i]] = i;
  }
  build(1, 0, maxn - 30);
  for (int i = 1; i <= n; i++)
    if (id[a[i] + 1] < id[a[i]]) updata(1, a[i], 1);
  int m;
  scanf("%d", &m);
  while (m--) {
    int op, l, r;
    scanf("%d%d%d", &op, &l, &r);
    if (op == 1) {
      int ans = query(1, l, r);
      if (query(1, r, r) == 0) ans++;
      printf("%d\n", ans);
    } else {
      swap(id[a[l]], id[a[r]]);
      swap(a[l], a[r]);
      for (int i = -1; i <= 1; i++) {
        int k = a[l] + i;
        if (id[k + 1] < id[k])
          updata(1, k, 1);
        else
          updata(1, k, 0);
        k = a[r] + i;
        if (id[k + 1] < id[k])
          updata(1, k, 1);
        else
          updata(1, k, 0);
      }
    }
  }
}
