MnZn 刚学 OI 1ms 分块 0pt 球调
查看原帖
MnZn 刚学 OI 1ms 分块 0pt 球调
675466
zzx0102楼主2024/12/27 13:56
#include<bits/stdc++.h>
using namespace std;
const int N = 200010, B = 500;
int p[N], cnt[N], k[N], w[N], n, m, in[B], L[B], R[B], len, blo;
int main() {
	cin >> n; int len = sqrt(n);
	for(int i = 1; i <= n; i++) cin >> k[i];
	for(int i = 1; i <= n; i++) in[i] = (i + len - 1) / len;
	blo = in[n];
	for(int i = 1; i <= blo; i++) L[i] = (i - 1) * len + 1, R[i] = min(i * len, n);
	for(int i = n; i; i--) {
		if(i + k[i] > R[in[i]]) {
			cnt[i] = 1;
			p[i] = i + k[i];
		}
		else {
			cnt[i] = cnt[i + k[i]] + 1;
			p[i] = p[i + k[i]];
		}
	}
	cin >> m;
	while(m--) {
		int o, j, k0; cin >> o >> j; j++;
		if(o == 1) {
			int ans = 0, b = in[j];
			while(b < blo) {
				ans += cnt[j];
				j = p[j];
				b++;
			}
			while(j <= n) ans++, j += k[j];
			cout << ans << '\n';
		}
		else {
			cin >> k0;
			k[j] = k0;
			for(int l = R[in[j]]; l >= L[in[j]]; l--) {
				if(l + k[l] > R[in[j]]) {
					cnt[l] = 1;
					p[l] = l + k[l];
				}
				else {
					cnt[l] = cnt[l + k[l]] + 1;
					p[l] = p[l + k[l]];
				}
			}
			
		}
	}
	return 0;
}
2024/12/27 13:56
加载中...