ブロックチートポイント
ハチソンアウトステップと現在位置が達したブロックの数、再帰逆
変性ブロック暴力を変更
クエリTandaoからの修正の複雑さ
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 200009 ; const int型 MAXM = 509 ; INTのN、M、Q、T。 INTをL [MAXN]、R [MAXN]、K [MAXN]、BL [MAXN]。 INTのステップ[MAXN]、[MAXN]であり; インラインボイド変化(int型のx、int型のY){ K [X] = yと、 以下のために(int型 I = 1 [BL [X] + 1 ] - 1 ; iが> = L [BL [X]は; i-- ) もし(I + K [i]が> = L [I] + BL 1 ])ステップ[i]は= 1に[i]は= iが+ K [i]は、 そうでなければステップ[I] =ステップ[I + K [I] + 1、の[I]に= [I + K [I]]; } インラインINTクエリ(INT X){ int型 ANS = 0 。 一方、(x <= N)ANS + =ステップ[X]、X = [X]に、 戻るANSを。 } INT {main()の scanf関数(" %のD "、&N) T = SQRT(N)。 以下のために(int型 i = 1 ; iが++; iが<= N ){ scanf関数(" %のD "、&K [I])。 BL [I] =(I- 1)/ T + 1 。 もし(!BL [I] =のBL [I- 1 ])L [BL [I] = I。 } L [BL [N] + 1 ] = N + 1 。 以下のために(int型 I = N; I> = 1 ; i-- ){ 場合(I + K [i]は> = L [BL [I] + 1 ]){ ステップ[I] = 1 ; [I]に= I +は[i]はkは、 } 他の{ ステップ[I]ステップ[I + K [I] = + 1 。 [I]に [I +へ= K [I]]? } } scanf関数(" %のD "、&M)。 用(int型 iは= 1、OP、X、Y、iは<= M; iは++ ){ scanf関数(" %dの%のD "、&OP、&x)は、X ++ 。 もし(OPの== 1 ){ printf(" %d個の\ n " 、クエリ(X)); } 他の{ scanf関数(" %のD "、&Y)。 変化(X、Y) } } }