#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctime>
#include <cassert>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
inline int read_int(){
	int t=0;bool sign=false;char c=getchar();
	while(!isdigit(c)){sign|=c=='-';c=getchar();}
	while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
	return sign?-t:t;
}
inline LL read_LL(){
	LL t=0;bool sign=false;char c=getchar();
	while(!isdigit(c)){sign|=c=='-';c=getchar();}
	while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
	return sign?-t:t;
}
inline char get_char(){
	char c=getchar();
	while(c==' '||c=='\n'||c=='\r')c=getchar();
	return c;
}
inline void write(LL x){
	register char c[21],len=0;
	if(!x)return putchar('0'),void();
	if(x<0)x=-x,putchar('-');
	while(x)c[++len]=x%10,x/=10;
	while(len)putchar(c[len--]+48);
}
inline void space(LL x){write(x),putchar(' ');}
inline void enter(LL x){write(x),putchar('\n');}
const int MAXN=1e5+5,MAXB=600;
int b[MAXN];
struct Tree{
	int lef[MAXB<<2],rig[MAXB<<2];
	vector<int> p[MAXB<<2];
	void push_up(int k){
		int pos1=0,pos2=0,k1=k<<1,k2=k<<1|1;
		p[k].clear();
		_rep(i,lef[k],rig[k]){
			if(pos1<p[k1].size()&&pos2<p[k2].size()){
				if(p[k1][pos1]+pos2<p[k2][pos2])
				p[k].push_back(p[k1][pos1++]+pos2);
				else
				p[k].push_back(p[k2][pos2++]);
			}
			else if(pos1<p[k1].size())
			p[k].push_back(p[k1][pos1++]+pos2);
			else
			p[k].push_back(p[k2][pos2++]);
		}
	}
	void build(int k,int L,int R){
		lef[k]=L,rig[k]=R;
		int M=L+R>>1;
		if(L==R){
			p[k].push_back(b[M]);
			return;
		}
		build(k<<1,L,M);
		build(k<<1|1,M+1,R);
		push_up(k);
	}
	void update(int k,int pos){
		if(lef[k]==rig[k]){
			p[k][0]=b[pos];
			return;
		}
		int mid=lef[k]+rig[k]>>1;
		if(pos<=mid)
		update(k<<1,pos);
		else
		update(k<<1|1,pos);
		push_up(k);
	}
	int query(int v){
		int lef=1,rig=p[1].size(),ans=0;
		while(lef<=rig){
			int mid=lef+rig>>1;
			if(v+mid>p[1][mid-1]){
				ans=mid;
				lef=mid+1;
			}
			else
			rig=mid-1;
		}
		return ans;
	}
}tree[MAXB];
int blk_id[MAXN],lef[MAXB],rig[MAXB];
int main()
{
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	int n=read_int(),blk_sz=sqrt(n*log(n))/2+1,m=n/blk_sz;
	if(n%blk_sz)m++;
	_rep(i,1,n)b[i]=i-1-read_int();
	_for(i,0,m){
		lef[i]=i*blk_sz+1;
		rig[i]=min((i+1)*blk_sz,n);
		_rep(j,lef[i],rig[i])
		blk_id[j]=i;
		tree[i].build(1,lef[i],rig[i]);
	}
	int q=read_int();
	while(q--){
		int opt=read_int(),x=read_int();
		if(opt==1){
			b[x]=x-1-read_int();
			tree[blk_id[x]].update(1,x);
		}
		else{
			int ans=b[x];
			_rep(i,x+1,rig[blk_id[x]]){
				if(ans>=b[i])
				ans++;
			}
			_for(i,blk_id[x]+1,m)
			ans+=tree[i].query(ans);
			enter(ans+1);
		}
	}
	return 0;
}
