# -*- nim -*-
import os, strutils
type
PNode = ref TNode
TNode {.final, acyclic.} = object
left, right: PNode
item: int
proc checkTree(node: PNode): int =
result = node.item
if node.left != nil:
inc result, checkTree(node.left) - checkTree(node.right)
proc makeTreeAux(item, depth: int): PNode =
new(result)
result.item = item
if depth > 0:
result.left = makeTreeAux(2 * item - 1, depth - 1)
result.right = makeTreeAux(2 * item, depth - 1)
proc makeTree(item, depth: int): PNode =
#GC_disable()
result = makeTreeAux(item, depth)
#GC_enable()
proc main =
var n = parseInt(paramStr(1))
const minDepth = 4
var maxDepth = if minDepth+2 > n: minDepth+2 else: n
var stretchDepth = maxDepth + 1
echo("stretch tree of depth ", stretchDepth, "\t check: ", checkTree(
makeTree(0, stretchDepth)))
var longLivedTree = makeTree(0, maxDepth)
var iterations = 1 shl maxDepth
for depth in countup (minDepth, stretchDepth-1, 2):
var check = 0
for i in 1..iterations:
check += checkTree(makeTree(i, depth)) + checkTree(makeTree(-i, depth))
echo(iterations*2, "\t trees of depth ", depth, "\t check: ", check)
iterations = iterations div 4
echo("long lived tree of depth ", maxDepth, "\t check: ",
longLivedTree.checkTree)
echo GC_getstatistics()
main()