メンテナンス上のTreeセクションでは、永続01trieすることができ
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define担当者(I、B)(I =(A)がINT;方には<=(B); iが++) の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I) の#defineは長い長いっ の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照 の#define INF 0x3f3f3f3f の#define CLR( 、V)のmemset(A、V、はsizeof A) ///////////////////////////////// / CONST INT N = 2E6 + 10 。 INT T [N]、SIZ [N << 5 ]、T [N << 5 ] [ 2 ]、NCNT。 空アップノード(int型 K、INTプリ、INT&POS) { POS = ++ NCNT。 SIZ [POS] = SIZ [事前] + 1 。 T [POS] [ 0 ] = T [事前] [ 0 ]。 T [POS] [ 1 ] = T [事前] [ 1 ]。 もし(K < 0)のリターン; INT C =(ヴァル>> K)&1 。 アップノード(k - 1 、ヴァル、T [事前] [C]、T [POS] [C])。 } INT Qmaxの(INT K、INTヴァル、INTプリ、int型POS) { もし(K < 0)戻り 0 ; INT C =(ヴァル>> K)&1 。 int型の SI = SIZ [T [POS] [C ^ 1 ] - SIZ [T [事前] [C ^ 1 ]。 もし(SI)リターン(1 << K)+ Qmaxの(K- 1、ヴァル、T [事前] [C ^ 1 ]、T [POS] [C ^ 1 ])。 他 戻り Qmaxの(K- 1 、ヴァル、T [事前] [C]、T [POS] [C])。 } int型のヘッド[N]、トップ[N]、POS、ID [N]、TOT、FA [N]、DEP [N]、息子[N]、SIZ [N]、N、M、ノード[N]。 構造体のエッジ{ INT NEX、へ;}エッジ[N << 1]; ボイド追加(INT A、INT B){エッジ[++ POS] =(エッジ){B、ヘッド[A]};ヘッド[A] = POS;} ボイド DFS1(int型のx、int型F) { FA [X ] = F; DEP [X] = DEP [F] + 1 ; SIZ [X] = 1 ;息子[X] = 0 ; 以下のために(int型 ; I I = I =ヘッド[X] エッジ[I] .nex) { int型 V = エッジ[I] .TO。 もし(vは== f)を続けます。 DFS1(V、x)は、SIZ [X] + = SIZ [V]。 もし(SIZ [息子[X] <SIZ [V])息子[X] =V; } } ヴァル)をボイド DFS2(int型のx、int型topf) { トップ[X] = topf; ID [X] = ++ TOT。 アップノード(30、ノード[X]、T [tot- 1 ]、T [TOT])。 もし(息子[X])DFS2(息子[X]、topf)。 以下のために(int型 ; I I = I =ヘッド[X] エッジ[I] .nex) { int型 V =エッジ[I] .TO。もし(V == FA [X] || V ==息子[X])続けます。 DFS2(V、V); } } int型 Qmaxを(int型のx、int型の Y、INT { INTを ANS = 0 。 一方(上部[X] =!トップ[Y]) { 場合(DEP [TOP [X] < DEP [トップ[Y])スワップ(X、Y) ANS = MAX(ANS、Qmaxと(30、ヴァル、T [ID [TOP [X]] - 1 ]、T [ID [X]]))。 X = FA [TOP [X]]。 } もし(DEP [X]> DEP [Y])スワップ(X、Y) ANS = MAX(ANS、Qmaxと(30、ヴァル、T [ID [X] - 1 ]、T [ID [Y]]))。 戻るANSを。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 担当者(I、1、N) のscanf(" %dの"、およびノード[I])。 担当者(I、1、N- 1 ) { int型、B; scanf関数(" %dの%のD "、&、&B)。 (B)の追加;(B、A)を加えます。 } DFS1(1、0 ); DFS2(1、1)。INTのX、Y、Z、OP。 一方、(M-- ) { scanf関数(" %のD "、&OP)。 もし(OP == 1)のscanf(" %dの%のD "、およびX&Y)のprintf(" %d個の\ n "、Qmaxと(30、Y、T [ID [X] - 1 ]、T [ID [X] + SIZ [X] - 1 ]))。 他のscanf(" %D%D%D "、およびX&Y、およびZ)のprintf(" %d個の\ n " 、Qmaxの(X、Y、Z))。 } 戻り 0 。 }