効果:図セット$所与なし(X)$と$ S($ Sを求め、$ Xの$フリップ$ [のL、R] $レンジ片面当たり隣接小数点演算の(x)は$ Sに定義されていません。 Y)$は等しいです。
高速決意はそれぞれ$のULLの$のために乱数を取って、$ハッシュ$を使用する。$ CF 799F $技術に等しく設定され、排他的に、または決定され等しくすることができます。
その後、ブロッキングの程度を考慮してください。
光の点に関しては、1つのアイデアは、ハードカードが$ログ$の複雑さにもそうもがあるかどうかを判断するために暴力、フェンウィックツリーに隣接するクエリー側を列挙することです。
より良いアプローチは、代わりに木ブロックのアレイを使用して、$ O(1)$クエリを達成することです。
強調のため、各キーは$ X $の主要な貢献は、$ X $ $ $ベクトルの期間内に連続されるたびに更新隣接エッジの$ $ベクトルを格納することができるが、これは、位置を決定するために、2つの点を必要とします。
より良いアプローチは、サイドブロック、ブロック毎に各プリエンファシスの効果を考慮することで、その後境界暴力に、全体が各マーカーは問い合わせることができ修正暴力クエリをマーキング。
#include <iostreamの> する#include <ランダム> の#include <cstdioを> する#include <math.h>の に#define REP(I、N)のための(iは= int型、iが<= N; I ++) の#define - PER(I、N)のための式(I; I> = A I = N INT) の#define PB一back の#define X最初 の#define yは第 名前空間stdを使用。 typedefの符号なしlong longのULL。 typedefのペア<int型、int型> PII。 CONST int型N = 2E5 + 10。 INTのN、M、U [N]、V [N]、度[N]。 チャーANS [N]。 ベクター<PII>小[N]。 INT S、C [N]、C2 [N]、C3 [N]、ID [N]。 [800] [800] F ULL。 ULL [N]、S [N]。 ボイドUPD(INT X){ REP(I、X / S * S、X)C [I] ^ = 1、S [U [I] ^ = [V [I]、S [V [i]は] ^ = [U [I]]。 PER(I、0、X / S-1)C2 [I] ^ = 1、C3 [I] ^ = 1; ULLクエリ(INT X){ 戻りC1 [X] ^ C2の[X / S]。 } ULL QRY(INT X){ ULL ANS = 0。 IF(ID [X]){ PER(I、0、M / S)IF(C3 [i])とANS ^ = F [i]が[ID [X]]。 戻りANS ^ S [X]。 } (自動E:小さな[X])のためのIF(クエリ(EX))ANS ^ = [EY]。 ANSを返します。 } のstd :: MT19937 RD(時間(0))。 ボイドの仕事(){ scanf関数( "%d個の%のD"、&N、&M)、S = 1.5 *のSQRT(M)。 REP(I、0、M + 5)C [I] = C2を[I] = C3の[I] = 0; REP(I、0、N + 5)S [I] = ID [I] =゜[I] = 0、小[I] .clear(); REP(I、1、M){ scanf関数( "%d個の%のD"、U + I、V I +)。 ++度[U [I]、++度[V [i]は]。 } UPD(M)。 REP(I、1、N)の場合(DEG [I]> = S)ID [I] = ++ * ID。 PER(I、0、M / S)REP(j、0、* ID)[I] [J] = 0 F。 スロー(S> = 800)であれば、 スロー(* ID> = 800)であれば、 (800 = M / S>)もし投げます。 REP(I、1、M){ int型ID = I / S。 IF(ID [U [I])F [ID] [ID [U [I]]] ^ = [V [I]]。 他の小[U [I] PB(PII(I、V [I]))。 IF(ID [V [I])F [ID] [ID [V [I]]] ^ = [U [I]]。 他の小[V [I] PB(PII(I、U [I]))。 } int型Q、CNT = 0。 scanf関数( "%のD"、&Q)。 一方、(q--){ int型のOP、X、Y。 scanf関数( "%D%D%D"、&OP、およびX&Y)。 IF(OP == 1)UPD(Y)、UPD(X-1)。 他ANS [++ CNT = QRY(X)== QRY(y)は'1': '0'。 } ANS [CNT + 1] = 0; プット(ANS + 1)。 } int型のmain(){ REP(I、0、 int型のトン。 scanf関数( "%のD"、&T)。 一方、(t--)ワーク(); }