#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
const int B = 316; // Kích thước 1 block
const int K = 317; // Số block
int n, m;
int a[N];
int id[N]; // id[i] là số hiệu của block quản lí i
int l[K], r[K]; // l[id], r[id] là đầu mút trái nhất và phải nhất của block id
int nxt[N]; // nxt[i] là ô đầu tiên của block tiếp theo mà i có thể nhảy đến
int step[N]; // step[i] là số bước cần để từ ô i nhảy được đến ô nxt[i]
void build() {
for (int i = 0; i < K; i++) l[i] = r[i] = -1;
for (int i = 1; i <= n; i++) {
id[i] = i / B;
if (l[id[i]] == -1) l[id[i]] = i;
r[id[i]] = i;
}
for (int i = n; i >= 1; i--) {
if (i + a[i] > r[id[i]]) {
step[i] = 1;
nxt[i] = i + a[i];
}
else {
step[i] = 1 + step[i + a[i]];
nxt[i] = nxt[i + a[i]];
}
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(); // O(n)
while (m--) {
int type; cin >> type;
if (type == 0) {
int pos, val;
cin >> pos >> val;
a[pos] = val;
for (int i = pos; i >= l[id[pos]]; i--) { // O(B)
if (i + a[i] > r[id[i]]) {
step[i] = 1;
nxt[i] = i + a[i];
}
else {
step[i] = 1 + step[i + a[i]];
nxt[i] = nxt[i + a[i]];
}
}
}
else {
int s; cin >> s;
// Từ s ta sử dụng mảng nxt[] đã tính để nhảy đến block cuối cùng
// Trong quá trình nhảy thì ta cũng cộng thêm số bước ở mỗi lần nhảy
int ans = 0, last = -1;
while (nxt[s] <= n) { // O(N / B)
ans += step[s];
s = nxt[s];
}
// Khi đã đến block cuối cùng (block có chứa n)
// thì ta sẽ nhảy chay cho đến khi vượt ra khỏi mảng
// Trong quá trình nhảy thì cũng lưu lại ô trước đó đã đi qua
while (s <= n) { // O(B)
++ans;
last = s;
s = s + a[s];
}
cout << last << ' ' << ans << '\n';
}
}
}