from typing import Optional, List, Dict, Set class Heap: def __init__( self ) -> None: self.fro : List[ List[ int ] ] = [] self.to : List[ List[ int ] ] = [] self.scan = 0 def boundcheck( self, obj_id: int, index: int ) -> bool: return obj_id >= 0 and \ obj_id < len( self.to ) and \ index < len( self.to[ obj_id ] ) def read( self, obj_id: int, index: int ) -> Optional[int]: if not self.boundcheck( obj_id, index ): return None return self.to[ obj_id ][ index ] def write( self, obj_id: int, index: int, value: int ) -> bool: if not self.boundcheck( obj_id, index ): return False self.to[ obj_id ][ index ] = value return True def collect( self ) -> None: self.fro = self.to self.to = [] self.scan = 0 assert self.copy( 0 ) == 0 while self.scan < len( self.to ): o = self.to[ self.scan ] for i in range( len( o ) ): o[ i ] = self.copy( o[ i ] ) self.scan += 1 print( self.to ) def copy( self, ref: int ) -> int: if ref < 0: return ref nref = self.fro[ ref ][ 0 ] - len( self.fro ) if nref < 0: nref = len( self.to ) self.to.append( self.fro[ ref ].copy() ) self.fro[ ref ][ 0 ] = nref + len( self.fro ) return nref def make( self, size: int ) -> int: self.to.append( [ 0 for _ in range( size ) ] ) return len( self.to ) - 1 import run_tests