기술
: 설명은
지속적를 zkysb하고 ...... 확인하도록 설정 될 수 있기 때문에
hzwer을 : AC를 갈겨 쓰다 수, 폭력은 표준 프로세스 강화
KuribohG을 : 내가 이상에 경로를 압축하지 않습니다!
ndsf : 폭력이 쉽게 악용 할 수 있습니다!
ZKY은 : ...
m 운전의 N-세트
조작 :
. 1 AB 및이 병합 세트 여기서 b를
K (2) K 번째 동작 후의 상태 (쿼리 카운트 동작)을 다시
3 시종 B 속하는 동일한 설정하려면 물어, 그것 인 출력 1, 그렇지 않으면 0 출력
이 문제가 암호화 된 A, B, K 주어진 온라인 강제 참고를위한 암호화 방법은 x = X XOR lastans 초기 lastans 값 0
0 <N-, m <= 2 * 10 ^ 5
입력
산출
샘플 입력
5 6
1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
1 2
3 1 2
2 1
3 0 3
2 1
3 1 2
샘플 출력
1
0
1
0
1
3673와 유사합니다.
1 #INCLUDE <iostream> 2 #INCLUDE <cstdio> 3 #INCLUDE <cstdlib> 4 #INCLUDE <CString을> 5 이용 스페이스 성병; 6 INT의 아들 [ 4000010 ] [ 2 ], 파 [ 4000010 ], CNT; 7 공극 빌드 ( INT 및 X, INT의 L, INT R) 8 { 9 X = ++ CNT; 10 경우 (L이 == R) 11 { 12 파가 [X] = L 단계; 13 창 ; 14 } 15 INT 중간 = (L + R) >> 1 ; 16 빌드 (SON [X] [ 0 ], L, MID); 17 빌드 (SON [X] [ 1 ], 중간 + 1 , R); 18 } 19 무효 업데이트 ( INT 및 X, INT의 L, INT의 R, INT의 P, INT의 V) 20 { 21 CNT ++ ; 22 아들 [CNT] [ 0 ] = 아들 [X] [ 0 ]; 23 아들 [CNT] [ 1 ] = 아들 [X] [ 1 ]; 24 X = CNT; 25 의 경우 (L == R) 26 { 27 파 [X] = V; (28) 반환 ; 29 } 30 INT 중간 = (L + R) >> 1 ; 31 일 경우 (p <= MID) 업데이트 (SON [X] [ 0 ], L, 중, P, V); 32 다른 업데이트 (SON [X] [ 1 ], 중간 + 1 , R, P, V); 33 } 34 INT getpar ( INT (X), INT의 L, INT의 R, INT의 P) (35) { 36 의 경우 (L == R) 복귀 파 [X]; 37 INT 중간 = (L +의 연구) >> 1 ; 38 의 경우 (p <= MID) 복귀 getpar (SON [X] [ 0 ], L, 중, P); 도 39는 다른 반환 (SON [X] [getpar 1 ] 미드 + 1 , R, P); 40 } 41 INT의 루트 [ 200010 ]; 42 INT의 N, m; 43 쌍 < INT , INT > getrot ( INT의 K, INT (X)) 44 { 45 INT와이; 46 의 INT RNK = 0 ; (47) 동안 ((Y = getpar (루트 [K], 1 , N, X)) = X!) RNK ++, X = Y; 48 리턴 make_pair (X, RNK); 49 } 50 INT ANS; 51 INT 의 main () 52 { 53 는 scanf ( " %의 D % d에 " , N, m); 54 빌드 (루트 [ 0 ] (1) , N); (55) 에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ ) 56 { 57 int로 영업 이익; 58 는 scanf ( " %의 D " , OP); (59) 만약 (연산 == 2 ) 60 { 61 INT의 K; 62 는 scanf ( " %의 D ' , K); 63 K ^ = 된 ANS; 64 루트 [I] = 루트 [K]; 65 } 66 또 67 { 68 루트 [I]가 루트 = [I- 1 ]; 69 INT의 A, B; (70) scanf와 ( " % d 개 %의 D ' , A, 및 B); 71 ^ = 된 ANS; B = ^의 ANS; 72 쌍 < INT , INT > TA = getrot (I- 1 , a), TB = getrot (I- 1 , b); (73) A = ta.first; B = tb.first; 74 의 경우 (연산 == 1 ) 75 { 76 INT RA = ta.second, RB = tb.second; (77) 의 경우 (a! = b) 78 { 79 의 경우 (RA <RB) 업데이트 (루트 [I] (1),붙잡다); 80 다른 업데이트 (루트 [I], 1 , N, B, A); 81 } 82 } 83 또 84 { 85 의 경우 (a ==의 b) ANS = 1 ; 다른 ANS = 0 ; 86 의 printf ( " % D \ 없음 " , ANS); 87 } 88 } 89 } 90 반환 0 ; 91 }