互いに素セット保守区間の木の合併
プラスbでは
#include <iostreamの> する#include <cstdioを> の#define RI登録INT の#define U INT 名前空間OPT { インラインU における(){ UX(0)、F(1 )。 チャーS(GETCHAR())。 一方、(S < ' 0 ' || S> ' 9 ' ){ もし、(S == ' - ')、F = - 1 。 S = GETCHAR()。 } 一方、(S> = ' 0 ' && S <= ' 9 ' ){ X =(X << 1)+(X << 3)+ S- ' 0 ' 。 S = GETCHAR()。 } 戻り X * F。 } } 使用してオプトインを:: で、 #define NN 100005の名前空間XDS { 構造体ノード{ UL、R、和、追加。 } [NN << 6 ]。 U NUM、ANS [NN]、腐敗[NN]。空プッシュダウン(のconst U&RT、constの U&L、 CONST U&R){ 場合([RT] .add){ なら!)[RT] .L([RT] .L = ++ NUM。 もし(![RT] .R)[RT] .R = ++ NUM; U半ば((L + R)>> 1 )。 [RT] .L] .add + = A [RT] .add。 [RT] .R] .add + = A [RT] .add。 [RT] .L] .SUM + = A [RT] .add *(MID-L + 1 )。 [RT] .R] .SUM + = A [RT] .add *(R- MID)。 [RT] .add = 0 。 } } ボイド更新(U&RT、CONST、U&LをCONST、U&R CONST、U&X CONST、U&Y のconst U&K){ 場合(RT)RT = ++!NUM。 場合(L> = X && R <= Y){ [RT] .SUM + = K *(R-L + 1)、[RT] .add + = K。 リターン; } プッシュダウン(RT、L、R)。 U半ば((L + R)>> 1 )。 もし(x <= MID)更新([RT] .L、L、中、X、Y、K)。 もし(Y> =ミッド+ 1)の更新は、([RT] .R、中間+ 1 、R、X、Y、K)。 [RT] .SUM= [RT] .L] .SUM + [RT] .R] .SUM。 } Uクエリ(CONST U&RT、CONST U&L、CONST U&R、CONST U&K){ 場合(K> [RT] .SUM)リターン - 1 。 もし(L == R)戻りANS [L]。 プッシュダウン(RT、L、R)。 U半ば((L + R)>> 1 )。 もし([RT] .L] .SUM> = k)の戻りクエリ([RT] .L、L、中、K)。 他 戻りクエリ([RT] .R、中間+ 1、R、K-[RT] .L] .SUM)。 } _x;ボイドマージ(U&X、CONST U&Y){ 場合(X ||!Y){ 場合(X!)X = Y。 リターン; } [X] .SUM + = [Y] .SUM、[X] .add + = [Y] .add。 マージ([X] .L、[Y] .L)、マージ([X] .R、[Y] .R)。 } } 名前空間CAS { U FA [NN]。 U getfa(UX){ U _x(x)は、K。 一方、(_x ^ FA [_x])_x = FA [_x]。 一方、(X ^ _x)K = FA [X]、FA [X] = _ X、X = K。 リターン } } 名前空間の主力{ UV [NN]。 使用して 名前空間のCASを。 使用して 名前空間のXDSを、 インラインボイド(){解決 U N(中())、M(中に)(); 用(RI I(1); I <= N; ++ I)FA [I] = I。 用(RI I(1 V [I] =; I <= N ++ I))中)(ANS [Vを[I] = I、更新(腐敗[getfa(I)]、1、N、 V [i]は、V [i]は、1 )。 用(RI I(1 ; I <= M ++){I) U _a(中())、_ B(もし中())。 (getfa(_a)^ getfa(_B)){ マージ(腐朽[getfa(_a)]、腐敗[getfa(_B)])。 FA [getfa(_B)] = getfa(_a)。 } } (U Q で())。 一方、(Q-- ){ チャー_s(GETCHAR())。 しばらく(!_s = ' Q '!&& _ S = ' B ')_s = getchar関数(); U _a(中())、_ B(中)(); もし(_s == ' Q '){ のprintf(" %dの\ n "、クエリ(腐敗[getfa(_a)]、1 、N、_B))。 } 他{ 場合(getfa(_a)^ getfa(_B)){ マージ(腐朽[getfa(_a)]、腐敗[getfa(_B)])。 FA [getfa(_B)] = getfa(_a)。 } } } } } int型のmain(){ // freopenは( "X.TXT"、 "R"、標準入力)。 // freopenは( "my.txt"、 "W"、STDOUT)。 std ::イオス:: sync_with_stdio(偽); 主力::(解決)。 }