不知道为啥TLE
#include<iostream>
#include<math.h>
#define int long long
using namespace std;
int st[450],ed[450],bel[200005],a[200005],to[200005],f[200005],dao[200005];
signed main(){
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
int block=sqrt(n);
int t=n/block;
if(n%block)t++;
for(int i=1;i<=t;i++){
st[i]=(i-1)*block+1;
ed[i]=i*block;
}
ed[t]=n;
for(int i=1;i<=n;i++){
cin>>a[i];
bel[i]=(i-1)/block+1;
}
for(int i=n;i>=1;i--){
if(i+a[i]>ed[bel[i]]){
f[i]=1;
to[i]=i+a[i];
dao[i]=i;
}
else{
f[i]=f[i+a[i]]+1;
to[i]=to[i+a[i]];
dao[i]=dao[i+a[i]];
}
}
while(m--){
int x,y;
cin>>x>>y;
if(x==1){
int sum=0,maxx=-1;
while(y<=n){
sum+=f[y];
maxx=dao[y];
y=to[y];
}
cout<<maxx<<" "<<sum<<endl;
}
else{
int k;
cin>>k;
a[y]=k;
for(int i=ed[bel[y]];i>=st[bel[y]];i--){
if(i+a[i]>=ed[bel[y]]){
f[i]=1;
to[i]=i+a[i];
dao[i]=i;
}
else{
f[i]=f[i+a[i]]+1;
to[i]=to[i+a[i]];
dao[i]=dao[i+a[i]];
}
}
}
}
}