bzoj 3674:持続互いに素セットを向上させることができます

説明

説明:
永続をzkysbしてチェックするように設定することができますので、......
hzwerは:ACを走り書きすることができ、暴力は、標準的なプロセスステップ
KuribohGを:私は以上のパスを圧縮しないでください!
NDSF:暴力は簡単に悪用することができます!
ZKY:......

m個の動作のnセット
:操作
1 AB&マージ、Bセット。
操作k番目の2 K後の状態(クエリカウント動作)バック
3 ABは、同じセットに属するB、それは、尋ねます出力1は、そうでなければ0を出力
この問題は暗号化され、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  使って 名前空間STDを、
6  INTの息子[ 4000010 ] [ 2 ]、パー[ 4000010 ]、CNT。
7  ボイドビルド(INT&X、int型の L、INT R)
 8  {
 9      X = ++ CNT。
10      であれば(L == R)
 11      {
 12          パー[X] = リットル;
13          リターン;
14      }
 15      INT半ば=(L + R)>> 1 16      ビルド(息子[X] [ 0 ]、L、MID)。
17      ビルド(息子[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)更新(息子[X] [ 0 ]、L、中、P、V)。
32      他の更新(息子[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 + R)>> 1 38      であれば(p <= MID)戻り getpar(息子[X] [ 0 ]、L、中、P)。
39       戻り getpar(息子[X] [ 1 ]、ミッド+ 1 、R、P)。
40  }
 41  のintルート[ 200010 ]。
42  int型N、M。
43対< INTINT > getrot(INT K、INT X)
 44  {
 45      INTY;
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型 I = 1 ; I <= M Iは++ 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の"、&​​、&B)。
71              ^ =のANS; B ^ =のANS。
72              対< INTINT > TA = getrot(I- 1、A)、TB = getrot(I- 1 、B)。
73              = ta.first; B = tb.first。
74              であれば(OPの== 1 75              {
 76                  INT RA = ta.second、RB = tb.second。
77                  であれば(!= B)
 78                  {
 79                      であれば(RA <RB)更新(ルート[i]が、1、N、A、B)。
80                      他の更新(ルート[I]、1 、N、B、A)。
81                  }
 82              }
 83              他の
84              {
 85                  であれば(== b)はANS = 1他の ANS = 0 ;
86                  のprintf(" %d個の\ n " 、ANS)。
87              }
 88          }
 89      }
 90      リターン 0 91 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/ZJXXCN/p/11455242.html
おすすめ