rt,可以参考 这个
#include <bits/stdc++.h>
#define N 100000
#define KP 317
using namespace std;
class SqrtDec
{
public:
int l,r;
}block[KP+1];
int a[N+1],bi[N*2+1],cnt[N*2+1],pos[N*2+1],n,kp;
void bbuild()
{
int i;
for(i=1;i<=kp;i++)
{
block[i].l=(i-1)*kp+1;
block[i].r=i*kp;
}
block[kp].r=n;
}
void bset(int x,int k)
{
int xi=bi[x],i;
a[x]=k;
for(i=x;bi[i]==xi;i--)
if (bi[i]==bi[i+a[i]])
cnt[i]=cnt[i+a[i]]+1,pos[i]=pos[i+a[i]];
else cnt[i]=1,pos[i]=i+a[i];
}
pair<int,int> bcnt(int x)
{
int res(0),i=x,pre=0;
while(i<=n) res+=cnt[i],pre=i,i=pos[i];
return make_pair(pre,res);
}
int main()
{
//[CF13E]Holes
int m,opt,x,k,i;
scanf("%d%d",&n,&m);
kp=ceil(sqrt(n));
bbuild();
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
bi[i]=(i-1)/kp+1;
}
for(i=n;i>=1;i--)
if (bi[i]==bi[i+a[i]])
cnt[i]=cnt[i+a[i]]+1,pos[i]=pos[i+a[i]];
else cnt[i]=1,pos[i]=i+a[i];
while(m--)
{
scanf("%d%d",&opt,&x);
if (opt==0)
{
scanf("%d",&k);
bset(x,k);
}
else if (opt==1)
{
pair<int,int> ans=bcnt(x);
printf("%d %d\n",ans.first,ans.second);
}
}
}