满江红(全WA)+能过样例
#include<cstdio>
#include<cmath>
#define int long long
int n,m;
int k[200010];
struct Block
{
int len;
int cnt;
int l[200010],r[200010];
int belong[200010];
int v[200010];
int s[200010];
void build()
{
len=sqrt(n);
cnt=n/len;
if(n%len) cnt++;
for(int i=1;i<=cnt;i++)
{
l[i]=(i-1)*len+1;
r[i]=i*len;
}
r[cnt]=n;
for(int i=1;i<=cnt;i++) belong[i]=i/len;
for(int i=n;i>=1;i--)
{
v[i]=i+k[i];
if(v[i]>r[belong[i]]) s[i]=1;
else s[i]=s[v[i]]+1,v[i]=v[v[i]];
}
}
void update(int j,int num)
{
k[j]=num;
for(int i=r[belong[j]];i>=l[belong[j]];i--)
{
v[i]=i+k[i];
if(v[i]>r[belong[i]]) s[i]=1;
else s[i]=s[v[i]]+1,v[i]=v[v[i]];
}
}
int query(int j)
{
int ans=0;
while(j<=n) ans+=s[j],j=v[j];
return ans;
}
}block;
signed main()
{
freopen("P3203_1.in","r",stdin);
freopen("out.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&k[i]);
block.build();
scanf("%lld",&m);
while(m--)
{
int op,x,y;
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
printf("%lld\n",block.query(x+1));
}
else
{
scanf("%d%d",&x,&y);
block.update(x+1,y);
}
}
fclose(stdin),fclose(stdout);
return 0;
}