トピック:
分析:
歴史を求めて2点間の接続かどうか - >互いに素セットは永続的かもしれません。
注:ツリーの社長の範囲からゼロ基準点がなければならない:0〜N-1
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define半ば((L + R)>> 1) の#define N 9000005 INT ndnum = 0 、LC [N]、RC [N]、FA [N]、DEP [N]、ED [N]、N、M ; ボイドビルド(INT S、INT L、INT R) { 場合(L == R)FA {[S]は、Lを=。返します。} ビルド(LC [S] = ++ ndnum、L、MID)。ビルド(RC [S] = ++ ndnum、中間+ 1 、R)。 } ボイド(変更INT S、int型の L、int型の R、int型POS)を { 場合(L == R){DEP [S] ++; 返します。} であれば(POS <= MID)変更(LC [S]、L、中間、POS)。 そうでなければ(RC [S]、ミッド+修正1 、R、POS)。 } int型の照会(INT S、INT L、のint R、int型のPOS) { 場合(L == R)リターンS。 もし(POS <= MID)戻りクエリ(LC [S]、L、中間、POS)。 他 戻りクエリ(RC [S]、ミッド+ 1 、R、POS)。 } 無効マージ(int型最後、INT&RT、int型L、のint R、int型の POS、int型F) { RT = ++ ndnum。LC [RT] = LCの[最終]。RC [RT] = RC [最終]。 もし(L == R)FA {[RT] Fを=。[RT] DEP [最終] = DEP。返します。} であれば(POS <= MID)マージ(LC LC [RT]、[最終]、L、中間、POS、F)。 他のマージ(RC RC [RT]、[最終]、ミッド+ 1 、R、POS、F)。 } INT get_fa(INT S、int型のPOS) { int型今=クエリ(S、0、N- 1 、POS)。 もし(FA [今] == POS)リターン今。 戻りget_faを(S、FA [今])。 } チャー OP [ 5 ]。 INT メイン() { freopenは(" history.in "、" R " 、STDIN)。 freopenは(" history.out "、" W " 、STDOUT)。 int型 V、X、Y、C = 0、T、FL = 0 。 scanf関数(" %d個の%のD "、&N、&M)。 ビルド(ED [ 0 ] = ++ ndnum、0、N- 1 )。 int型 I =0 ; 一方(M-- ){ scanfの(" %のS " 、OP); IF(OP [ 0 ] == ' K ')scanfの(" %のD "、&V)、V = C、FL = 0 ; / / イタリアなお:いない怒り王を変更した後、 IF(OP [ 0 ] == ' R&LT ' ){ 私は ++; ED [I] = ED [I- 1 ]; scanfの(" %のDの%のD "、 X&、&Y)、 IF(FL)X =(X + C)%N-、Y =(Y + C)%のn-。 INT F1 = get_fa(ED [I]、X)、F2 = get_fa(ED [i]は、Y); もし(FA [F1] == FA [F2])続けます。 もし(DEP [F1]> DEP [F2])スワップ(F1、F2)。 マージ(ED [I - 1 ]、ED [i]は、0、N- 1 、FA [F1]、FA [F2])。 もし(DEP [F1] == DEP [F2])を変更(ED [i]は、0、N- 1 、FA [F2])。 } もし(OP [ 0 ] == ' T ' ){ scanf関数(" %D%D%D "、およびX&Y、&T)。 int型F1 = get_fa(ED [MAX(0、IT)]、X)、F2 = get_fa(ED [MAX(0、それ)]、Y); INT F3 = get_fa(ED [I]、X)、F4 = get_fa(ED [i]は、Y); もし(!FA [F1] = FA [F2] && FA [F3] == FA [F4])のprintf(" Y \ N ")、FL = 0 ; 他のprintf(" Nの\ n ")、FL = 1 。 } } 戻り 0 。 } / * 3 7 R 0 1 T 0 1 1 K 1 R 0 1 T 0 1 1 R 0 1 T 0 2 1 * /