#include<bits/stdc++.h> #define rei register int #define N 110010 usingnamespace std;
template <typename T> inlinevoidread(T &x) { x = 0; int f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') f = -f; ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();} x *= f; }
int n, m, f[N][351], num, que[N], ed, a[N], ans[N], xx[N], yy[N];
inlinevoidPre() { for (rei i = n; i >= 1; i--) { for (rei j = 1; j <= ed; j++) { if (i + a[i] + que[j] > n) f[i][que[j]] = 1; else f[i][que[j]] = f[i + a[i] + que[j]][que[j]] + 1; } } }
intmain() { read(n); num = sqrt(n); for (rei i = 1; i <= n; i++) read(a[i]); read(m); for (rei i = 1; i <= m; i++) { int x, y; read(x); read(y); xx[i] = x; yy[i] = y; if (y <= num) que[++ed] = y; else { int cnt = 0; while (x <= n) x = x + a[x] + y, cnt++; ans[i] = cnt; } } sort(que + 1, que + 1 + ed); ed = unique(que + 1, que + 1 + ed) - que - 1; Pre(); for (rei i = 1; i <= m; i++) { if (ans[i]) printf("%d\n", ans[i]); elseprintf("%d\n", f[xx[i]][yy[i]]); } return0; }
#include<bits/stdc++.h> #define rei register int #define N 200010 usingnamespace std;
template <typename T> inlinevoidread(T &x) { x = 0; T f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') f = -f; ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();} x *= f; }
int n, head[N], edge_cnt = 1, ans[N], f[N], fa[N], dfn[N], dfs_cnt, T; structedge {int nxt, v;} e[N << 1];
inlinevoidadd_edge(int u, int v){e[++edge_cnt].nxt = head[u]; head[u] = edge_cnt; e[edge_cnt].v =v;}
inlinevoidDfs(int u, int pre) { fa[u] = pre; for (rei i = head[u]; i; i = e[i].nxt) { int v = e[i].v; if (v == pre) continue; Dfs(v, u); } dfn[++dfs_cnt] = u; }
inlineintsolve(int k) { int ret = 0; for (rei i = 1; i <= n; i++) f[i] = 1; for (rei id = 1; id <= n; id++) { int u = dfn[id]; if (!fa[u] || f[u] == -1 || f[fa[u]] == -1) continue; if (f[fa[u]] + f[u] >= k) f[u] = f[fa[u]] = -1, ret++; // 连子树 else f[fa[u]] = max(f[u] + 1, f[fa[u]]); // 向上连 } return ret; }
intmain() { read(n); T = sqrt(n * log2(n)); for (rei i = 1; i < n; i++) { int u, v; read(u); read(v); add_edge(u, v); add_edge(v, u); } Dfs(1, 0); ans[1] = n; for (rei i = 2; i <= T; i++) ans[i] = solve(i); for (rei i = T + 1; i <= n; i++) { int le = i, ri = n, mid, tmp = solve(i), ret; while (le <= ri) { mid = (le + ri) >> 1; if (solve(mid) == tmp) le = mid + 1, ret = mid; else ri = mid - 1; } for (rei j = i; j <= ret; j++) ans[j] = tmp; i = ret; } for (rei i = 1; i <= n; i++) printf("%d\n", ans[i]); return0; }