持続可能なと同じツリーについて書くの配列の会長が、木の会長に代表される、すべての木の間隔が同じではありませんが、同じ範囲のすべての木の配列を持続することが、残りは上の書かれていますほとんど。
コードを接続します。
#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; }