/**
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002
题意:每个位置能够跳到下一个位置为i+s[i];
单点询问:当前点跳出n 需要跳多少步;
单点更新:将当前s[i]替换为val;
分块裸题;
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
/**********************************************Head-----Template****************************************/
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){ll gg=gcd(a,b);a/=gg;if(a<=LLONG_MAX/b) return a*b;return LLONG_MAX;}
/********************************Head----Temlate**********************************************/
const int maxn=2e5+7;
int n,m,s[maxn],pos[maxn];
int nxx[maxn],nxy[maxn];
//跳至下一块多少步 ; 跳至下一块的步数;
void update(int id,int val){
s[id]=val;
for(int i=id;i>=min(n,(pos[id]-1)*m);i--){/**************只影响当前块前的元素 tricks **************************/
if(i+s[i]>min(n,pos[i]*m)) {
nxx[i]=1;
nxy[i]=i+s[i];
}
else {
nxx[i]=nxx[i+s[i]]+1;
nxy[i]=nxy[i+s[i]];
}
}
}
int query(int l){
int ans=0;
while(l<=n){
ans+=nxx[l];
l=nxy[l];
}
return ans;
}
void pre(){
for(int i=n;i>=1;i--){
if(i+s[i]>min(n,pos[i]*m)) {
nxx[i]=1;
nxy[i]=i+s[i];
}
else {
nxx[i]=nxx[i+s[i]]+1;
nxy[i]=nxy[i+s[i]];
}
}
}
void solved(){
read(n);m=sqrt(n);
for(int i=1;i<=n;i++) read(s[i]),pos[i]=(i-1)/m+1;
pre();
int q;read(q);
while(q--){
int ch,l,r;
read(ch);
if(ch==1) {
read(l);
writeln(query(l+1));
}
else {
read(l),read(r);
update(l+1,r);
}
}
}
int main(){
solved();
return 0;
}