https://www.luogu.org/problemnew/show/P3391
トレーニングボードを書き換える前にタイトル書かれた説明を取得。trueにwdnmd「==」「=」はコンパイラエラー聖歌書き込まれません。
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 const int型MAXN = 100010; N INT、M、RT = 0、C [MAXN] [2] = {}、FAは[MAXN] = {} = {} [MAXN]リバース、= {} [MAXN] SIZ。 インラインボイド押し上げ(INT X){ SIZ [X] = SIZ [[x]は[C 0] + SIZ [C [X] [1]] + 1。 } ボイドプッシュダウン(INT X){ IF(REV [X]){ スワップ(C [X] [0]、C [X] [1])。 REV [C [X] [0]] ^ = 1; REV [C [X] [1] ^ = 1; REV [X] = 0; } } ボイドビルド(int型のx、int型、L、R INT){ IF(L> R)のリターン; IF(L == R){ FA [L] = xと; SIZ [L] = 1。 (lは<X)C [X] [0] L =あれば、 他[X] [1] L = C。 返します。 } INT半ば=(L + R)/ 2。 (MID、L、ミッド1)を構築;(MID、ミッド+ 1、r)を構築します。 IF(中間<X)C [X] [0] =ミッド。 他[X] [1] =ミッドC。 FA [中間] = xで、押上(MID)。 } ボイド腐敗(INT X、INT&K){ int型PA = FA [X]、GPA、L、R、GPA = FA [PA]。 (x == C [PA] [0])、L = 0の場合。 そうでなければ、L = 1。R = L ^ 1。 IF(!PA = K){ (C [GPA] [0] == PA)C [GPA] [0] = xであれば、 他C [GPA] [1] = xと; }他のk = xと; FA [X] = GPA; FA [PA] = xと; FA = PA [X] [R] C]。 C [PA] [L] = Cを[X] [R]、C [X] [R] = PA。 突き上げ(PA)。突き上げ(X)。 } / *ボイドDFS(INT X){ IF(X == 0)のリターン; COUT << X << C [X] [0] << C [X] [1] << ENDL。 DFS(C [X] [0])。 DFS(C [X] [1])。 } * / ボイドスプレイ(INT X、INT&K){ 一方(X = K!){ int型PA = FA [X]; int型のGPA = FA [PA]。 IF(PA!= K){ IF((C [GPA] [1] == PA)^(C [PA] [1] == x))を腐敗(X、K)。 他の腐敗(PA、K); }腐敗(X、K)。 // DFS(RT); coutの<<てendl; } } int型(int型V、INT X){見つける プッシュダウン(X)。 IF(V == SIZ [C [x]は[0] + 1)リターンX。 他の場合(V <SIZ + 1 [X] [0] C])戻り検索(V、C [X] [0])。 他戻り検索(V-SIZ [X] [0] C] - 1、C [X] [1])。 } ボイドMREV(int型のL、R INT){ int型のx =検索(L、RT)、Y =(R + 2、RT)を見つけます。 // COUT << X << Y << ENDL。 スプレイ(X、RT)、スプレイ(Y、C [X] [1])。 // COUT << SIZ [Y] << ENDL。 REV [C [Y] [0]] ^ = 1; } int型のmain(){ scanf関数( "%D%dの"、&N、&M)。 (0,1、N + 2)を構築; RT =(3 + N)/ 2。 以下のために(INT I = 1; I <= M; ++ I){ int型のX、Y。 scanf関数(」 (X = Y!)場合MREV(X、Y) } (i = 1をint型、iが<= N; I ++)のために{ printf( "%dの"、検索(I + 1、RT)-1)。 } COUT << ENDL。 0を返します。 }