[タイトル]イタリア
ツリーが有するn個のノードは2つの動作モードがあり、最初は白色です。
1×1 のノードの代表的な黒にX
2. 2 X クエリを表現は、xは、単純な黒のノード番号のいずれかでツリーへのパス上のノードの最小数を
入力T 及びZ 前記tは操作の種類を表し、X =(Z +最終)MOD + N-1 、L A Sの照会に対する回答のT代表最初に、一度0、最初の操作であることを確実にします
[データ範囲]
N、Q <= 1E6。
[説明]
最初の動作が前処理してもよい[i]は、ディスカバリ1保証される最初の点は、黒ルートを染色することができる、その最小DISへのパス上の各点。
私は、各ルートノードと黒色点の最小数の最小数を持つ経路中のすべての黒ドットにポイントを見つけました。
コードは以下の通りであります:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 1E6 + 5 。 INT 、N、Q、最後[N]、DIS [N]、サイズ、last1、OPT、XX、ZX。 構造体PIGU { int型のDAO、NE。 } [N << 1 ]。 インラインボイド lingjiebiao(int型のx、int型Y) { [ .dao = ++サイズ] Y。 【サイズ】.NE = 最後[X]。 最後[X] = サイズ。 } インライン無効 DFS(int型今、int型FA) { DIS [今] = 分(DIS [今]、今)。 用(INT ; I iは=私が最後[今] = [I] .NEを) { 場合([i]が.dao == FA)続けます。 DIS [i]は.dao] = DIS [今]。 DFS([I] .dao、今)。 } } インラインint型リード() { チャー C = GETCHAR()。 INT X = 0 。 しばらく(!isdigit(c)参照)、C = getchar関数(); 一方、(isdigit(c)参照){X =(x << 3)+(X << 1)+ C- '0 ' ; C = GETCHAR();} 戻りX。 } int型のmain() { memsetの(DIS、0x3fを、はsizeof (DIS))。 N =読み取る(); Q = 読み取り()。 以下のために(INT iが= 1、X、Yと、iが<= N- 1、I ++ ) { X =()を読み出し、Y =は)(読み取ります。 lingjiebiao(X、Y) lingjiebiao(Y、X)。 } OPT =()を読み出し、XX = read()は、 INT RT = XX%N + 1 。 DFS(RT、0 ); ZX = DIS [RT]。 用(INT iは= 1 ; I <= Q- 1 ; I ++ ) { OPT =読み取る(); XX =は(読み取り) XX =(last1 + XX)%のN + 1 。 もし(OPT == 1 ) { ZX = 分(ZX、DIS [XX])。 } 他 { COUT <<分(ZX、DIS [XX])<< " \ n " 。 XX = 分(ZX、DIS [XX])。 last1 = XX; } } }