rt,讨论区所有方法的试过了。
#include <bits/stdc++.h>
using namespace std;
int a[1919810],b[1919810],c[1919810];
int d[1919810],e[1919810];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int n1=n,cnt=1,last=0,cnt1=n%int(int(sqrt(n))*1.2);
while(n1>=0)
{
int now=int(int(sqrt(n))*1.2)*cnt;
if(cnt<=cnt1) now++;
d[cnt]=now;
cnt++;
n1-=now-last;
if(n1<0) break;
b[now]=1;
c[now]=now+a[now];
e[now]=now;
// cout<<b[now]<<" "<<c[now]<<endl;
for(int i=now-1;i>=last+1;i--)
{
if(i+a[i]>now)
{
b[i]=1;
c[i]=i+a[i];
e[i]=i;
}
else
{
b[i]=b[i+a[i]]+1;
c[i]=c[i+a[i]];
e[i]=e[i+a[i]];
}
}
last=now;
}
b[n]=1;
c[n]=n+a[n];
e[n]=n;
for(int i=n;i>=last+1;i--)
{
if(i+a[i]>n)
{
b[i]=1;
c[i]=i+a[i];
e[i]=i;
continue;
}
b[i]=b[i+a[i]]+1;
c[i]=c[i+a[i]];
e[i]=e[i+a[i]];
}
if(last!=n) cnt++;
cnt--;
for(int i1=1;i1<=m;i1++)
{
int x;
cin>>x;
if(x==1)
{
int q,sum=0;
cin>>q;
int sum1=0;
while(q<=n)
{
sum1=e[q];
sum+=b[q];
q=c[q];
}
cout<<sum1<<" "<<sum<<"\n";
}
else
{
int j,k;
cin>>j>>k;
a[j]=k;
for(int l=1;l<=cnt-1;l++)
{
if(d[l]>=j&&d[l-1]<j)
{
b[d[l]]=1;
c[d[l]]=d[l]+a[d[l]];
e[d[l]]=d[l];
// cout<<b[d[j]]<<" "<<c[d[j]]<<endl;
for(int i=d[l]-1;i>=d[l-1]+1;i--)
{
if(i+a[i]>d[l])
{
b[i]=1;
c[i]=i+a[i];
e[i]=i;
continue;
}
b[i]=b[i+a[i]]+1;
c[i]=c[i+a[i]];
e[i]=e[i+a[i]];
// cout<<b[i]<<" "<<c[i]<<endl;
}
break;
}
}
}
}
return 0;
}