#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int a[maxn], ps[maxn], sum[maxn << 2];
void build(int l, int r, int rt) {
  if (l == r) {
    sum[rt] = ps[l + 1] < ps[l];
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void update(int p, int l, int r, int rt) {
  if (l == r) {
    sum[rt] = ps[l + 1] < ps[l];
    return;
  }
  int m = (l + r) >> 1;
  if (p <= m)
    update(p, l, m, rt << 1);
  else
    update(p, m + 1, r, rt << 1 | 1);
  sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
int query(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) return sum[rt];
  int m = (l + r) >> 1, ret = 0;
  if (L <= m) ret += query(L, R, l, m, rt << 1);
  if (m < R) ret += query(L, R, m + 1, r, rt << 1 | 1);
  return ret;
}
int main() {
  int i, j, m, n, l, r, x, y;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]), ps[a[i]] = i;
  build(1, n - 1, 1);
  scanf("%d", &m);
  while (m--) {
    scanf("%d%d%d", &x, &l, &r);
    if (x == 1) {
      if (l != r)
        printf("%d\n", 1 + query(l, r - 1, 1, n - 1, 1));
      else
        printf("1\n");
    } else {
      if (l == r) continue;
      swap(ps[a[l]], ps[a[r]]);
      swap(a[l], a[r]);
      x = min(a[l], a[r]), y = max(a[l], a[r]);
      if (x > 1) update(x - 1, 1, n - 1, 1);
      update(x, 1, n - 1, 1);
      update(y - 1, 1, n - 1, 1);
      if (y < n) update(y, 1, n - 1, 1);
    }
  }
  return 0;
}
