#include<bits/stdc++.h>
#define ls ch[p][0]
#define rs ch[p][1]
#define gget(x) (ch[f[x]][1]==x)
#define isrt(x) (ch[f[x]][0]!=x&&ch[f[x]][1]!=x)
using namespace std;
const int N=2e5+5;
int n,m,a[N],sz[N];
bool tag[N];
unsigned short f[N],ch[N][2];
void pushup(int p){sz[p]=sz[ls]+sz[rs]+1;}
void modify(int p){
tag[p]^=1;
swap(ls,rs);
}
void pushdown(int p){
if(tag[p]){
if(ls)modify(ls);
if(rs)modify(rs);
tag[p]=0;
}
}
void update(int p){
if(!isrt(p))update(f[p]);
pushdown(p);
}
void rotate(int x){
int y=f[x];
int z=f[y];
int k=gget(x),tmp=ch[x][!k];
if(!isrt(y))ch[z][ch[z][1]==y]=x;
ch[x][!k]=y,ch[y][k]=tmp;if(tmp)f[tmp]=y;
f[y]=x,f[x]=z;
pushup(y);pushup(x);
}
void splay(int x){
update(x);
for(int fa;fa=f[x],!isrt(x);rotate(x))
if(!isrt(fa))
rotate(gget(fa)==gget(x)?fa:x);
pushup(x);
}
int access(int x){
int p;
for(p=0;x;p=x,x=f[x]){
splay(x);
ch[x][1]=p;
pushup(x);
}
return p;
}
void makert(int p){
access(p);
splay(p);
modify(p);
}
void link(int x,int p){
makert(x);
f[x]=p;
}
int split(int x,int y){
makert(x);
access(y);
splay(y);
return sz[y];
}
void cut(int x,int p){
makert(x);access(p);splay(p);
ch[p][0]=f[x]=0;
pushup(p);
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n+1;i++)sz[i]=1;
for(int i=1;i<=n;i++){
cin>>a[i];
link(i,i+a[i]<=n?i+a[i]:n+1);
}
cin>>m;
while(m--){
int opt,j;
cin>>opt>>j;j++;
if(opt==1){
cout<<split(j,n+1)-1<<"\n";
}else{
int k;cin>>k;
int old=a[j];
cut(j,j+old<=n?j+old:n+1);
a[j]=k;
link(j,j+k<=n?j+k:n+1);
}
}
return 0;
}
提交记录