1 #include<cstdio> 2 #include<cmath> 3 int a[200006],n,m,b[200006],c[200006],dian[200006],l[200006],r[200006]; 4 int main() 5 { 6 scanf("%d",&n); 7 for(int i=1;i<=n;i++) 8 scanf("%d",&a[i]); 9 int len,len1; 10 len1=floor(sqrt(n)); 11 len=n/len1; 12 if(len1*len1!=n) 13 len++; 14 for(int i=1;i<=len;i++) 15 { 16 l[i]=(i-1)*len1+1; 17 r[i]=i*len1; 18 } 19 r[len]=n; 20 for(int i=1;i<=n;i++) 21 dian[i]=(i-1)/len1+1; 22 for(int i=len;i>0;i--) 23 for(int j=r[i];j>=l[i];j--) 24 { 25 if(j+a[j]>r[i]) 26 { 27 b[j]=j+a[j]; 28 c[j]=1; 29 } 30 else 31 { 32 b[j]=b[j+a[j]]; 33 c[j]=c[j+a[j]]+1; 34 } 35 } 36 scanf("%d",&m); 37 for(int i=0;i<m;i++) 38 { 39 int a1,a2,a3; 40 scanf("%d%d",&a1,&a2); 41 a2++; 42 if(a1==1) 43 { 44 int sum=0; 45 for(int j=a2;j<=n;j=b[j]) 46 sum+=c[j]; 47 printf("%d\n",sum); 48 } 49 else 50 { 51 scanf("%d",&a3); 52 a[a2]=a3; 53 for(int j=a2;j>=l[dian[a2]];j--) 54 { 55 if(j+a[j]>r[dian[a2]]) 56 { 57 b[j]=j+a[j]; 58 c[j]=1; 59 } 60 else 61 { 62 b[j]=b[j+a[j]]; 63 c[j]=c[j+a[j]]+1; 64 } 65 } 66 } 67 } 68 return 0; 69 }
暴力分块