RE on #14,弹飞绵羊过了,这边RE了,尝试关了O2也没用,还特地把数组开得贼大,但实在想不出哪里会越界了(
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,B,nex[1000009],k[1000009],step[1000009];
bool sam(int a,int b){
return (a-1)/B==(b-1)/B;
}
int opt,x,y;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>k[i];
B=ceil(sqrt(n));
for(int i=n;i;i--){
if(sam(i,i+k[i])&&i+k[i]<=n) step[i]=step[i+k[i]]+1,nex[i]=nex[i+k[i]];
else nex[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%lld",&opt);
if(opt==0){
scanf("%lld%lld",&x,&y);
k[x]=y;
if(sam(x,x+k[x])&&x+k[x]<=n) step[x]=step[x+k[x]]+1,nex[x]=nex[x+k[x]];
else nex[x]=x,step[x]=0;
for(int j=x-1;sam(x,j);j--){
if(step[j]&&j+k[j]<=n) step[j]=step[j+k[j]]+1,nex[j]=nex[j+k[j]];
}
}
else{
scanf("%lld",&x);
int cnt=0;
while(x<=n){
cnt+=step[x]+1;
x=nex[x];
y=x;
x=x+k[x];
}
printf("%lld %lld\n",y,cnt);
}
}
return 0;
}