学習の永続化配列

持続可能なと同じツリーについて書くの配列の会長が、木の会長に代表される、すべての木の間隔が同じではありませんが、同じ範囲のすべての木の配列を持続することが、残りは上の書かれていますほとんど。

コードを接続します。

#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム>
 の#define半ば((L + R)>> 1)
 使用して 名前空間STDを、
CONSTの INT N = 1E6 + 10 

インラインint型リード(){
     int型 REF = 0、X = 1チャー CH = GETCHAR()。
    一方、(!isdigit(CH)){ 場合(CH == ' - ')X = - 1 ; CH = GETCHAR();}
     ながら(isdigit(CH)){ REF =参考文献 * 10 + CH- ' 0 ' ; CH = GETCHAR();}
     戻り REF * X。
} 

int型、N Mと、
INT RT [N]、ヴァル[N]、TOT。
INT [N]。
構造体ツリー{
     int型のVal、LS、RS。
} T [N << 4 ]。

ボイドビルド(INT&X、int型の L、INT R){ 
    X = ++ TOT。
    もし(L == R){ 
        T [X] .val = [L]。
        返します
    }
    ビルド(T [X] .ls、L、MID)。
    ビルド(T [X] .RS、中間 + 1 、R)。
} 

ボイドアップデータ(INT&X、INT最後、int型の L、int型の R、int型の POS、int型K){ 
    X = ++ TOT。
    T [X] = T [最終]。
    もし(L == R){ 
        T [X] .val = K。
        返します
    } 
    であれば(POS <= MID)アップデータ(T [X] .ls、T [最終] .ls、L、中間、POS、K)。
    他のアップデータ(T [X] .RS、T [最終] .RS、中間+ 1 、R、POS、K)。
} 

INTクエリ(int型のx、int型の L、int型の R、int型のPOS){
     場合(L == R)戻りT [X] .val。
    もし(POS <= MID)戻りクエリ(T [X] .ls、L、中間、POS)。
     戻りクエリ(T [X] .RS、中間+ 1 、R、POS)。
} 

int型のmain()
{ 
    N =(読み取り)、M = read()は、
    以下のためにint型 I = 1 [I] = iが++; iが<= N) )(読み取ります。
    (RT [ビルド0 ]、1 、N)
    以下のためのint型I = 1 ; I <= M; iは++ ){
         int型のOP、X、Y、Z。
        X =読み取る()、OP = 読み取ります();
        もし(OPの== 1 ){ 
            yは読み取り=()、Z =を読み取ります()。
            アップデータ(RT [i]は、RT [x]は、1 、N、Y、Z)。
        } 
        { 
            Y = 読み取り()。
            RT [I] =のRT [X]。
            INT ANS =クエリ(RT [x]は、1 、N、Y); 
            printf(" %d個の\ n " 、ANS)。
        } 
    } 
    戻り 0; 
}

 

おすすめ

転載: www.cnblogs.com/nnezgy/p/11403558.html