[説明] Danfei羊

ブロックチートポイント

ハチソンアウトステップと現在位置が達したブロックの数、再帰逆

変性ブロック暴力を変更

クエリ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)
        }
    }
}

 

おすすめ

転載: www.cnblogs.com/superminivan/p/11702750.html