rt. 分块 TLE 60pts(所以这就是我为什么不喜欢用分块做题,比线段树难搞多了 qwq)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, B = 510;
int step[B][B], to[B][B];
int a[N];
int num;
int main() {
ios::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
num = (int)pow((double)n, 0.4);
int knum = (n % num == 0) ? num : num + 1;
int lastnum = (n % num == 0) ? num : n % num;
for (int i = n; i >= 1; i--) {
int pcn = (i - 1) / num, pos = (i - 1) % num + 1;
if (pos + a[i] > ((pcn == knum) ? lastnum : num)) {
to[pcn][pos] = i + a[i];
step[pcn][pos] = 1;
} else {
to[pcn][pos] = to[pcn][pos + a[i]];
step[pcn][pos] = step[pcn][pos + a[i]] + 1;
}
}
int m; cin >> m;
while (m--) {
int op;
cin >> op;
if (op == 1) {
// fprintf(stderr, "op = %d\n", op);
int x;
cin >> x;
x++;
// fprintf(stderr, "x = %d\n", x);
int pcn, pos;
int ans = 0;
while (x <= n) {
pcn = (x - 1) / num;
pos = (x - 1) % num + 1;
ans += step[pcn][pos];
x = to[pcn][pos];
}
cout << ans << '\n';
} else {
int x, k;
cin >> x >> k;
x++;
a[x] = k;
for (int i = (((x - 1) / num) + 1) * num; i > ((x - 1) / num) * num; i--) {
int pcn = (i - 1) / num, pos = (i - 1) % num + 1;
if (pos + a[i] > ((pcn == knum) ? lastnum : num)) {
to[pcn][pos] = i + a[i];
step[pcn][pos] = 1;
} else {
to[pcn][pos] = to[pcn][pos + a[i]];
step[pcn][pos] = step[pcn][pos + a[i]] + 1;
}
}
}
}
return 0;
}