记录编号 599311 评测结果 AAAAAAAAAA
题目名称 [HNOI 2010] 弹飞绵羊 最终得分 100
用户昵称 Gravatar会挽弯弓满月 是否通过 通过
代码语言 C++ 运行时间 2.519 s
提交时间 2025-03-07 21:55:08 内存使用 9.09 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
ll n,m,len,cnt;
ll a[N],id[N],step[N];
ll to[N],l[N],r[N];
void init(){
	len=sqrt(n);
	cnt=n/len;
	if(n%len>0) cnt++;
	for(ll i=1;i<=cnt;i++){
		l[i]=(i-1)*len+1;
		r[i]=min(n,i*len);
	}
	for(ll i=1;i<=n;i++){
		id[i]=(i-1)/len+1;
	}
	for(ll i=n;i>=1;i--){
		ll t=i+a[i];
		if(t>r[id[i]]){
			step[i]=1;
			to[i]=t;
		}
		else{
			step[i]=step[t]+1;
			to[i]=to[t];
		}
	}
	return ;
}
void update(ll p,ll d){
	a[p]=d;
	ll idp=id[p];
	ll le=l[idp],ri=r[idp];
	for(ll i=ri;i>=le;i--){
		ll t=i+a[i];
		if(t>r[id[i]]){
			step[i]=1;
			to[i]=t;
		}
		else{
			step[i]=step[t]+1;
			to[i]=to[t];
		}
	}
	return ;
}
ll ask(ll p){
	ll ans=0;
	while(p<=n){
		ans+=step[p];
		p=to[p];
	}
	return ans;
}
int main(){
	freopen("bzoj_2002.in","r",stdin);
	freopen("bzoj_2002.out","w",stdout);
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	init();
	scanf("%lld",&m);
	ll opt,a1,a2;
	while(m--){
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld",&a1);
			ll ans=ask(a1+1);
			printf("%lld\n",ans);
		}
		else{
			scanf("%lld%lld",&a1,&a2);
			update(a1+1,a2);
		}
	}
	return 0;
}