这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便
代码是学黄学长的 http://hzwer.com/3505.html
当然里面还是有一定我自己的想法在里面的 嫌我代码丑的可以去看黄学长的咯
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,block,sum;
int stp[M],w[M],fa[M],belong[M];
int l[],r[];
int push_ans(int x){
int ans=;
while(){
ans+=stp[x];
if(!fa[x]) break;
x=fa[x];
}
return ans;
}
int main()
{
n=read(); block=sqrt(n);
for(int i=;i<=n;i++) w[i]=read();
if(n%block) sum=n/block+;
else sum=n/block;
for(int i=;i<=sum;i++) l[i]=r[i-]+,r[i]=i*block;
r[sum]=n;
for(int i=;i<=n;i++) belong[i]=(i-)/block+;
for(int i=n;i;i--){
if(i+w[i]>n) stp[i]=;
else if(belong[i]==belong[i+w[i]]) stp[i]=stp[i+w[i]]+,fa[i]=fa[i+w[i]];
else stp[i]=,fa[i]=i+w[i];
}
int k,x,y;
m=read();
for(int i=;i<=m;i++){
k=read();
if(k==) x=read()+,printf("%d\n",push_ans(x));
else{
x=read()+; y=read(); w[x]=y;
for(int j=x;j>=l[belong[x]];j--){
if(belong[j]==belong[j+w[j]]) stp[j]=stp[j+w[j]]+,fa[j]=fa[j+w[j]];
else stp[j]=,fa[j]=j+w[j];
}
}
//for(int j=1;j<=n;j++) printf("[%d %d] ",fa[j],stp[j]); printf("\n");
}
return ;
}