package Ġcom . mth aler . array set Ċ Ċ import Ġjava . lang . Exception Ċ import Ġkotlin . math . min Ċ Ċ object ĠSet Utils Ġ{ ĊĊĠĠĠ Ġclass ĠAbort Control Ġ: ĠException () ĊĊĠĠĠ Ġval Ġabort Ġ= ĠAbort Control () ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠComparable < E >> union ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠArray < E > Ġ= ĊĠĠĠĠĠĠĠ ĠUnion Merge ( a , Ġb ). result () ĊĊĠĠĠ Ġfun Ġ Ġ< E Ġ: ĠComparable < E >> intersection ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠArray < E > Ġ= ĊĠĠĠĠĠĠĠ ĠIntersection Merge ( a , Ġb ). result () ĊĊĠĠĠ Ġfun Ġ Ġ< E Ġ: ĠComparable < E >> Ġdiff ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠArray < E > Ġ= ĊĠĠĠĠĠĠĠ ĠDiff Merge ( a , Ġb ). result () ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠComparable < E >> xor ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠArray < E > Ġ= ĊĠĠĠĠĠĠĠ ĠX or Merge ( a , Ġb ). result () ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠComparable < E >> subset Of ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSub set Of ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( x : ĠAbort Control ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠComparable < E >> intersect s ( a : ĠArray < E >, Ġb : ĠArray < E >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNo Intersect ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( x : ĠAbort Control ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠUnion Merge < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠArray Utils . new Array ( a . size Ġ+ Ġb . size , Ġa ) ĊĠĠĠĠĠĠĠ Ġvar Ġri : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( a , Ġai , Ġr , Ġri , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( a , Ġa 0 , Ġr , Ġri , Ġa 1 Ġ- Ġa 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġa 1 Ġ- Ġa 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( b , Ġb 0 , Ġr , Ġri , Ġb 1 Ġ- Ġb 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġb 1 Ġ- Ġb 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresult (): ĠArray < E > Ġ= ĠArray Utils . resize In Place ( r , Ġri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠIntersection Merge < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠArray Utils . new Array ( min ( a . size , Ġb . size ), Ġa ) ĊĠĠĠĠĠĠĠ Ġvar Ġri : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( a , ai , r , ri , 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġr ( ri ) Ġ= Ġa ( ai ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresult (): ĠArray < E > Ġ= ĠArray Utils . resize In Place ( r , Ġri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDiff Merge < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠArray Utils . new Array ( a . size , Ġa ) ĊĠĠĠĠĠĠĠ Ġvar Ġri : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( a , Ġa 0 , Ġr , Ġri , Ġa 1 Ġ- Ġa 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġa 1 Ġ- Ġa 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresult (): ĠArray < E > Ġ= ĠArray Utils . resize In Place ( r , Ġri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠX or Merge < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġri : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠArray Utils . new Array ( a . size Ġ+ Ġb . size , Ġa ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( a , Ġa 0 , Ġr , Ġri , Ġa 1 Ġ- Ġa 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġa 1 Ġ- Ġa 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( b , Ġb 0 , Ġr , Ġri , Ġb 1 Ġ- Ġb 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġri Ġ+= Ġb 1 Ġ- Ġb 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresult (): ĠArray < E > Ġ= ĠArray Utils . resize In Place ( r , Ġri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSub set Of < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġabort ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġclass ĠNo Intersect < E Ġ: ĠComparable < E >>( val Ġa : ĠArray < E >, Ġval Ġb : ĠArray < E >) Ġ: ĠBinary Merge () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge 0 ( 0 , Ġa . size , Ġ 0 , Ġb . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( ai : ĠInt , Ġbi : ĠInt ) Ġ= Ġa [ ai ]. compareTo ( b [ bi ]) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcollision ( ai : ĠInt , Ġbi : ĠInt ) Ġ{ Ġthrow Ġabort Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom A ( a 0 : ĠInt , Ġa 1 : ĠInt , Ġbi : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom B ( ai : ĠInt , Ġb 0 : ĠInt , Ġb 1 : ĠInt ) Ġ{} ĊĠĠĠ Ġ} Ċ }