不同块长WA的不同
#include<bits/stdc++.h>
using namespace std;
const int t=10005;
const int maxn=500005;
inline int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
struct node2 {
int tanli[t];
int l;
int r;
} kuai[t];
int pos[maxn];
int b[maxn];
int fa[maxn],val[maxn];
int B;
vector<int> zz[maxn];
void dfs(int a) {
// cout<<a<<endl;
for(int i=0; i<zz[a].size(); i++) {
int to=zz[a][i];
val[to]=val[a]+1;
fa[to]=fa[a];
dfs(to);
}
}
void add(int c,int k) {
int p=pos[c];
int num=c-B*(p-1);
kuai[p].tanli[num]=k;
// cout<<c<<" "<<k<<" "<<p<<endl;
int ll=kuai[p].l,rr=kuai[p].r;
for(int i=ll; i<=rr; i++) {
while(!zz[i].empty())
zz[i].pop_back();
fa[i]=i;
// cout<<i<<" "<<fa[i]<<endl;
}
for(int i=ll; i<=rr; i++) {
num=i-B*(p-1);
if(i+kuai[p].tanli[num]<=rr) {
zz[i+kuai[p].tanli[num]].push_back(i);
fa[i]=i+kuai[p].tanli[num];
}
}
for(int i=rr; i>=ll; i--) {
if(fa[i]==i) {
val[i]=0;
dfs(fa[i]);
}
}
}
int main() {
int n,tot=0;
cin>>n;
B=sqrt(n)+1;
// cout<<B<<"*"<<endl;
for(int i=1; i<=n; i+=B) {
tot++;
kuai[tot].l=i;
kuai[tot].r=min(n,i+B-1);
for(int j=i; j<=i+B-1; j++) {
pos[j]=tot;
}
}
for(int i=1; i<=n; i++) {
// cout<<i<<" "<<pos[i]<<endl;
int k;
k=read();
int p=pos[i];
kuai[p].tanli[i-B*(p-1)]=k;
b[i]=k;
}
for(int i=1; i<=n; i++) {
add(i,b[i]);
}
/* for(int i=1; i<=n; i++) {
int p=pos[i];
// cout<<kuai[p].tanli[i-(p-1)*B]<<endl;
}*/
int m;
cin>>m;
for(int i=1; i<=m; i++) {
int opt;
opt=read();
if(opt==1) {
int ans=0;
int fir;
fir=read();
fir++;
int p=pos[fir];
// cout<<"*"<<i<<" "<<fir<<endl;
while(fir+kuai[p].tanli[fir]<=n) {
p=pos[fir];
// cout<<p<<" "<<fir<<" "<<kuai[p].tanli[fir-B*(p-1)]<<endl;
if(fa[fir]==fir) {
fir+=kuai[p].tanli[fir-B*(p-1)];
ans++;
} else {
ans+=val[fir];
fir=fa[fir];
}
}
cout<<ans<<endl;
continue;
}
int c,k;
c=read();
k=read();
add(c+1,k);
}
return 0;
}