bzoj 3674 : 지속성 이산 세트를 향상시킬 수있다

기술

: 설명은
지속적를 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
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 }
코드보기

 

추천

출처www.cnblogs.com/ZJXXCN/p/11455242.html