Portal: http://www.lydsy.com/JudgeOnline/problem.php?id=2002
See a weekly eye record: http://www.cnblogs.com/ciao-sora/p/6099077.html
#include <cstdio> #include <cmath>const int maxn = 200005;int N, m, A[MAXN], TO[MAXN], NEED[MAXN], siz, id, T1, T2, T3, haji;inline int qry (int pos) {int rt = 0;while (~POS) {RT + = Need[pos];p os = To[pos];} return RT;} inline void upd (int pos, int val) {id = Pos/siz;haji = id * Siz;a[pos] = val;for (int i = pos; I >= Haji; i.) {if (i + A[i] >= N) {to[i] = -1;need[i] = 1;} else if (i + A[i] >= (ID + 1) * siz) {To[i] = i + a[i];need[i] = 1;} else {To[i] = to[i + A[i]];need[i] = Need[i + a[i]] + 1;}} int main (void) {scanf ("%d", &n), siz = (int) sqrt ((float) n + 0.5f), for (int i = 0; i < n; ++i) {scanf ("%d", A + i);} for (int i = n-1; ~i; i.) {id = i/siz;if (i + a[i] >= N) {to[i] = -1;need[i] = 1;} else if (i + A[i] >= (ID + 1) * siz) {To[i] = i + a[i];need[i] = 1;} else {To[i] = to[i + A[i]];need[i] = Need[i + a[i]] + 1;}} scanf ("%d", &m), while (m--) {scanf ("%d%d", &t1, &t2), if (T1 = = 1) {printf ("%d\n", Qry (T2));} else {scanf ("%d", &t3); UPD (T2, t3);}} return 0;}
_bzoj2002 [Hnoi2010]bounce, Flying sheep "sub-block"