code:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, L[N], R[N], bel[N], To[N], f[N], arr[N], Last[N], cnt, len, op, a, b; // 块数,期望块长
void build() {
cnt = sqrt(n), len = n / sqrt(n);
// 如果写成 len = n / cnt 会 WA #1, 不知道为什么。
for (int i = 1; i <= cnt; i++) L[i] = R[i - 1] + 1, R[i] = i * cnt;
R[cnt] = n;
for (int i = 1; i <= n; i++) bel[i] = (i + len - 1) / len;
for (int i = n; i >= 1; i--)
if (arr[i] + i > R[bel[i]])
f[i] = 1, To[i] = i + arr[i], Last[i] = i;
else
f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]], Last[i] = Last[i + arr[i]];
}
void updata (int x, int y) {
arr[x] = y;
for (int i = R[bel[x]]; i >= L[bel[x]]; i--)
if (arr[i] + i > R[bel[i]])
f[i] = 1, To[i] = i + arr[i], Last[i] = i;
else
f[i] = f[i + arr[i]] + 1, To[i] = To[i + arr[i]], Last[i] = Last[i + arr[i]];;
}
void query (int x) {
int ans = 0;
while (x <= n) {
ans += f[x];
if (To[x] > n) cout << Last[x] << ' ';
x = To[x];
}
cout << ans << '\n';
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> arr[i];
build();
while (m--) {
cin >> op >> a;
if (op == 0) cin >> b;
if (op == 1) query(a);
if (op == 0) updata (a, b);
}
}