30pts求调
查看原帖
30pts求调
701387
xiaoliebao1115楼主2024/7/18 10:47
#include<bits/stdc++.h>
using namespace std;
const int nn=2e5+5;
int n,a[nn],block,cnt[nn],wz[nn],m;
int main(){
	std::cin.tie(nullptr);
	std::ios::sync_with_stdio(false);
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	block=sqrt(n);
	for(int i=0;i<n;i++){
		int br=min(int(ceil(i*1.0/(block*1.0))*block)-1,n-1);
		int j=i,sum=0;
		while(1){
			j=j+a[j];
			sum++;
			if(j>br) break;
		}
		cnt[i]=sum,wz[i]=j;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			int x;
			cin>>x;
			int step=0;
			while(x<n){
				step+=cnt[x];
				x=wz[x];
			}
			cout<<step<<endl;
		}
		else{
			int x,k;
			cin>>x>>k;
			a[x]=k;
			int bl=(ceil(i*1.0/(block*1.0))-1)*block,br=min(int(ceil(i*1.0/(block*1.0))*block)-1,n-1);
			for(int j=x;j>=bl;j--){
				int nxt=j+a[j];
				if(nxt>br) cnt[j]=1,wz[j]=nxt;
				else cnt[j]=cnt[nxt]+1,wz[j]=wz[nxt];
			}
		}
	}
	return 0;
}
2024/7/18 10:47
加载中...