rt,代码中有注释说明,本代码与弹飞绵羊AC代码不同之处。
#include<bits/stdc++.h>
#define x first
#define y second
const int maxn=100010;
const int maxqn=455;
using namespace std;
inline int read(){
register int x=0;
register char c=getchar();
for(;!(c>='0'&&c<='9');c=getchar());
for(;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+c-'0';
return x;
}
int n,m,qn;
int a[maxn],block[maxn];
int f[maxn],g[maxn];
int L[maxqn],R[maxqn];
void change(int k,int x){
//不变
a[k]=x;
register int blo=block[k];
for(register int i=R[blo];i>=L[blo];i--){
if(i+a[i]>n)
f[i]=1,g[i]=-1;
else if(block[i+a[i]]==block[i])
f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
else
f[i]=1,g[i]=i+a[i];
}
}
pair<int,int> getans(int x){
//多加了ans统计最后调到的位置,其他不变
register int sum=0,ans=x;
while(x!=-1)
sum+=f[x],ans=x,x=g[x];
return make_pair(ans,sum);
}
int main(){
//不变
n=read(),m=read(),qn=sqrt(n);
for(register int i=1;i<=n;i++)
a[i]=read(),block[i]=(i-1)/qn+1;
for(register int i=1;i<=block[n];i++)
L[i]=(i-1)*qn+1,R[i]=min(i*qn,n);
register int opt,x,y;
for(register int i=n;i;i--){
if(i+a[i]>n)
f[i]=1,g[i]=-1;
else if(block[i+a[i]]==block[i])
f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
else
f[i]=1,g[i]=i+a[i];
}
pair<int,int>t;
while(m--){
//将x=read()+1换成了x=read()
opt=read(),x=read();
if(opt==1)
t=getans(x),printf("%d %d\n",t.x,t.y);
else change(x,read());
}
return 0;
}