记录编号 599368 评测结果 AAAAAAAAAA
题目名称 [HNOI 2010] 弹飞绵羊 最终得分 100
用户昵称 Gravatar彭欣越 是否通过 通过
代码语言 C++ 运行时间 1.885 s
提交时间 2025-03-08 17:27:26 内存使用 6.14 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int n,m,a[N],id[N],len;
int t[N],to[N];
struct node {
	int l,r;
}s[N];
void update (int l,int r) {
	for (int i=r;i>=l;i--) {
        if (i+a[i]>s[id[i]].r) {
            to[i]=i+a[i];
            t[i]=1;
        }else{
            to[i]=to[i+a[i]];
            t[i]=t[i+a[i]]+1;
        }
    }
}
int query (int x) {
    int ans=0;
    while (x<n) {
        ans+=t[x];
        x=to[x];
    }
    return ans;
}
int main () {
	freopen("bzoj_2002.in","r",stdin);
	freopen("bzoj_2002.out","w",stdout); 
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> n;
	len=sqrt(n);
	for (int i=0;i<n;i++) {
		cin >> a[i];
		id[i]=i/len;
	}
	for (int i=0;i<=id[n-1];i++) {
		s[i].l=i*len;
        s[i].r=(i+1)*len-1;
	}
	s[id[n-1]].r=n-1;
    update(0,n-1);
    cin >> m;
    while (m--) {
    	int opt,x,y;
    	cin >> opt >> x;
    	if (opt==1) cout << query(x) <<"\n";
		else {
			cin >> y;
            a[x]=y;
            update(s[id[x]].l,s[id[x]].r);
		} 
	}
	return 0;
}