func rotate_left_callback(n, parent *Node) {
	parent.m = n.m
	n.m = Max(n.high, Max(M(n.left), M(n.right)))
}
fix 'm' value caused by rotation
package interval_tree
import (
	"math"
)
const (
	RED = iota
	BLACK
)
type Node struct {
	left   *Node
	right  *Node
	parent *Node
	low   int64  
	high  int64  
	m     int64  
	color int
	data interface{}  
}
func (n *Node) Data() interface{} {
	return n.data
}
type Tree struct {
	root *Node
}
func new_node(low, high int64, data interface{}, color int, left, right *Node) *Node {
	n := Node{low: low, high: high, m: high, color: color, left: left, right: right, data: data}
	return &n
}
func (t *Tree) Lookup(low, high int64) *Node {
	n := t.root
	for n != nil && (low > n.high || n.low > high) {  
		if n.left != nil && low <= n.left.m {
			n = n.left  
		} else {
			n = n.right
		}
	}
	return n
}
func (t *Tree) Insert(low, high int64, data interface{}) {
	inserted_node := new_node(low, high, data, RED, nil, nil)
	if t.root == nil {
		t.root = inserted_node
	} else {
		n := t.root
		for {
			if inserted_node.m > n.m {
				n.m = inserted_node.m
			}
			if low < n.low {
				if n.left == nil {
					n.left = inserted_node
					break
				} else {
					n = n.left
				}
			} else {
				if n.right == nil {
					n.right = inserted_node
					break
				} else {
					n = n.right
				}
			}
		}
		inserted_node.parent = n
	}
	t.insert_case1(inserted_node)
}
func (t *Tree) DeleteNode(n *Node) {
	if n.left != nil && n.right != nil {
		pred := maximum_node(n.left)
		n.low = pred.low
		n.high = pred.high
		n.data = pred.data
		n = pred
	}
	fixup_m(n)
	var child *Node
	if n.right == nil {
		child = n.left
	} else {
		child = n.right
	}
	if node_color(n) == BLACK {
		n.color = node_color(child)
		t.delete_case1(n)
	}
	t.replace_node(n, child)
	if child != nil {  
		n.low = child.low
		n.high = child.high
		n.data = child.data
	}
	if n.parent == nil && child != nil {
		child.color = BLACK
	}
}
func Max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}
func M(n *Node) int64 {
	if n == nil {
		return int64(math.MinInt64)
	}
	return n.m
}