using System;
using System.Diagnostics;
namespace SampleNamespace
{
public class Node
{
public Node parent, left, right;
public int key;
public int accum;
}
public class SampleClass
{
static Node treeMinimum(Node x)
{
while (x.left != null)
x = x.left;
return x;
}
static Node treeSuccessor(Node x)
{
if (x.right != null)
return treeMinimum(x.right);
Node y = x.parent;
while ((y != null) && (x == y.right))
{
x = y;
y = y.parent;
}
return y;
}
static Node accumDelete(ref Node tree, Node z)
{
Node y = (z.left == null || z.right == null) ? z : treeSuccessor(z);
Node x = (y.left != null) ? y.left : y.right;
if (x != null)
x.parent = y.parent;
if (y.parent == null)
tree = x;
else if (y == y.parent.left)
y.parent.left = x;
else
y.parent.right = x;
if (y != z)
z.key = y.key;
return y;
}
static bool accumVerify(Node x, int lb, int ub, int c)
{
int k = x.key + c;
return x == null || (k > lb && k < ub &&
accumVerify(x.left, lb, k, c + x.accum) &&
accumVerify(x.right, k, ub, c + x.accum));
}
public static void Main()
{
Node
root = new Node { key = 5, accum = 100 },
a = new Node { parent = root, key = 6, accum = 300 },
b = new Node { parent = root, key = 7, accum = 400 },
c = new Node { parent = a, key = 10, accum = 50000 };
root.left = a;
root.right = b;
a.left = c;
Console.WriteLine("Verify: {0}", accumVerify(root, int.MinValue, int.MaxValue, 0));
} // End of Main function (program statup)
} // End of SampleClass
} // End of SampleNamespace
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpuYW1lc3BhY2UgU2FtcGxlTmFtZXNwYWNlCnsKICBwdWJsaWMgY2xhc3MgTm9kZQogICAgewogICAgICBwdWJsaWMgTm9kZSBwYXJlbnQsIGxlZnQsIHJpZ2h0OwogICAgICBwdWJsaWMgaW50IGtleTsKICAgICAgcHVibGljIGludCBhY2N1bTsKICAgIH0KICAKICAgIHB1YmxpYyBjbGFzcyBTYW1wbGVDbGFzcwogICAgewogICAgICBzdGF0aWMgTm9kZSB0cmVlTWluaW11bShOb2RlIHgpCiAgICAgIHsKICAgICAgICB3aGlsZSAoeC5sZWZ0ICE9IG51bGwpCiAgICAgICAgICB4ID0geC5sZWZ0OwogICAgICAgIHJldHVybiB4OwogICAgICB9CiAgICAgIAogICAgICAgIHN0YXRpYyBOb2RlIHRyZWVTdWNjZXNzb3IoTm9kZSB4KQogICAgICAgIHsKICAgICAgICAgIGlmICh4LnJpZ2h0ICE9IG51bGwpCiAgICAgICAgICAgIHJldHVybiB0cmVlTWluaW11bSh4LnJpZ2h0KTsKICAgICAgICAgIAogICAgICAgICAgTm9kZSB5ID0geC5wYXJlbnQ7CiAgICAgICAgICB3aGlsZSAoKHkgIT0gbnVsbCkgJiYgKHggPT0geS5yaWdodCkpCiAgICAgICAgICB7CiAgICAgICAgICAgIHggPSB5OwogICAgICAgICAgICB5ID0geS5wYXJlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4geTsgICAgICAgICAgCiAgICAgICAgfQogICAgICAKICAgICAgICBzdGF0aWMgTm9kZSBhY2N1bURlbGV0ZShyZWYgTm9kZSB0cmVlLCBOb2RlIHopCiAgICAgICAgICB7CiAgICAgICAgICAgIE5vZGUgeSA9ICh6LmxlZnQgPT0gbnVsbCB8fCB6LnJpZ2h0ID09IG51bGwpID8geiA6IHRyZWVTdWNjZXNzb3Ioeik7CiAgICAgICAgICAgIE5vZGUgeCA9ICh5LmxlZnQgIT0gbnVsbCkgPyB5LmxlZnQgOiB5LnJpZ2h0OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHggIT0gbnVsbCkKICAgICAgICAgICAgICB4LnBhcmVudCA9IHkucGFyZW50OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHkucGFyZW50ID09IG51bGwpCiAgICAgICAgICAgICAgdHJlZSA9IHg7CiAgICAgICAgICAgIGVsc2UgaWYgKHkgPT0geS5wYXJlbnQubGVmdCkKICAgICAgICAgICAgICB5LnBhcmVudC5sZWZ0ID0geDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHkucGFyZW50LnJpZ2h0ID0geDsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgaWYgKHkgIT0geikKICAgICAgICAgICAgICAgIHoua2V5ID0geS5rZXk7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgICB9CiAgICAgIAogICAgICAgICBzdGF0aWMgYm9vbCBhY2N1bVZlcmlmeShOb2RlIHgsIGludCBsYiwgaW50IHViLCBpbnQgYykKICAgICAgICAgewogICAgICAgICAgIGludCBrID0geC5rZXkgKyBjOwogICAgICAgICAgIHJldHVybiB4ID09IG51bGwgfHwgKGsgPiBsYiAmJiBrIDwgdWIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bVZlcmlmeSh4LmxlZnQsIGxiLCBrLCBjICsgeC5hY2N1bSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bVZlcmlmeSh4LnJpZ2h0LCBrLCB1YiwgYyArIHguYWNjdW0pKTsKICAgICAgICAgfQogICAgICAKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCiAgICAgICAgewogICAgICAgICAgTm9kZQogICAgICAgICAgICByb290ID0gbmV3IE5vZGUgeyBrZXkgPSA1LCBhY2N1bSA9IDEwMCB9LAogICAgICAgICAgICAgIGEgPSBuZXcgTm9kZSB7IHBhcmVudCA9IHJvb3QsIGtleSA9IDYsIGFjY3VtID0gMzAwIH0sCiAgICAgICAgICAgICAgICBiID0gbmV3IE5vZGUgeyBwYXJlbnQgPSByb290LCBrZXkgPSA3LCBhY2N1bSA9IDQwMCB9LAogICAgICAgICAgICAgICAgICBjID0gbmV3IE5vZGUgeyBwYXJlbnQgPSBhLCBrZXkgPSAxMCwgYWNjdW0gPSA1MDAwMCB9OwogICAgICAgICAgcm9vdC5sZWZ0ID0gYTsKICAgICAgICAgIHJvb3QucmlnaHQgPSBiOwogICAgICAgICAgYS5sZWZ0ID0gYzsKICAgICAgICAgIAogICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlZlcmlmeTogezB9IiwgYWNjdW1WZXJpZnkocm9vdCwgaW50Lk1pblZhbHVlLCBpbnQuTWF4VmFsdWUsIDApKTsKICAgICAgICAgIAogICAgICAgICAgCiAgICAgICAgfSAvLyBFbmQgb2YgTWFpbiBmdW5jdGlvbiAocHJvZ3JhbSBzdGF0dXApCiAgICB9IC8vIEVuZCBvZiBTYW1wbGVDbGFzcwp9IC8vIEVuZCBvZiBTYW1wbGVOYW1lc3BhY2UKCg==