#include <iostream>
#include <cstdio>
#include <algorithm>
const int nn = 1e5 + 5;
const int inf = 1e9;
struct node {
	int val, lazy, pos;
	#define val(p) tree[p].val
	#define lazy(p) tree[p].lazy
	#define pos(p) tree[p].pos
	#define ls (p << 1)
	#define rs (p << 1 | 1)
} tree[nn << 3];
void update(int p) {
	if (val(ls) < val(rs)) {
		val(p) = val(ls);
		pos(p) = pos(ls);
	} else {
		val(p) = val(rs);
		pos(p) = pos(rs);
	}
}
int c[nn];
void build(int p, int l, int r) {
	if (l == r) {
		val(p) = c[l];
		pos(p) = l;
		return;
	}
	int mid = l + r >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	update(p);
}
void pushdown(int p) {
	if (!lazy(p)) return;
	lazy(ls) += lazy(p);
	val(ls) += lazy(p);
	lazy(rs) += lazy(p);
	val(rs) += lazy(p);
	lazy(p) = 0;
}
void modify(int p, int l, int r, int pos, int val) {
	if (l == r) {
		val(p) = val;
		return;
	}
	pushdown(p);
	int mid = l + r >> 1;
	if (pos <= mid) modify(ls, l, mid, pos, val);
	else modify(rs, mid + 1, r, pos, val);
	update(p);
}
void add(int p, int l, int r, int ql, int qr) {
	if (ql <= l && r <= qr) {
		val(p)--; lazy(p)--;
		return;
	}
	pushdown(p);
	int mid = l + r >> 1;
	if (ql <= mid) add(ls, l, mid, ql, qr);
	if (mid < qr) add(rs, mid + 1, r, ql, qr);
	update(p);
}
int a[nn], stack[3005][3005], lenth[nn];
void build_b(int p, int l, int r) {
	for (int i = 1; i <= 2000; i++)
		tree[i] = (node){0, 0, 0};
	for (int i = l; i <= r; i++) c[i - l + 1] = a[i];
	int len = r - l + 1;
	build(1, 1, len);
	for (int i = 1; i <= len; i++) {
		stack[p][i] = std::max(val(1), stack[p][i - 1]);
		int pos = pos(1);
		if (pos != len) add(1, 1, len, pos + 1, len);
		modify(1, 1, len, pos, inf);
	}
	stack[p][lenth[p] + 1] = inf;
}
int n, m, block, bl[nn], l[nn], r[nn];
int main() {
	scanf("%d", &n);
	block = 80;
	for (int i = 1; i <= n; i++) {
		scanf("%d", a + i);
		bl[i] = (i - 1) / block + 1;
	}
	for (int i = 1; i <= bl[n]; i++) {
		l[i] = i * block - block + 1;
		r[i] = std::min(n, i * block);
		lenth[i] = r[i] - l[i] + 1;
		build_b(i, l[i], r[i]);
	}
	scanf("%d", &m);
	while (m--) {
		int opt, x;
		scanf("%d %d", &opt, &x);
		if (opt == 1) {
			scanf("%d", a + x);
			build_b(bl[x], l[bl[x]], r[bl[x]]);
		} else {
			int ans = a[x];
			for (int i = x + 1; i <= r[bl[x]]; i++) ans += (ans >= a[i]);
			for (int i = bl[x] + 1; i <= bl[n]; i++) {
				int pos = std::upper_bound(stack[i] + 1, stack[i] + lenth[i] + 2, ans) - stack[i];
				ans += pos - 1;
			}
			printf("%d\n", n - ans);
		}
	}
} 