interface KEY { boolean less(KEY k); // binary method boolean equals(KEY k); // binary method } interface ITEM { KEY key (); } class myKey implements KEY { private int val; static int M = 1000000; public boolean less (KEY k) { return val < ((myKey) k).val; } public boolean equals (KEY k) { return val == ((myKey) k).val; } void read () { val = In.getInt (); } void rand () { val = (int) (M * Math.random ()); } public String toString () { return val + ""; } } class myItem implements ITEM { private myKey val; private double info; myItem() { val = new myKey (); } public KEY key () { return val; } void read () { val.read (); info = In.getDouble (); } void rand () { val.rand (); info = (double) Math.random (); } public String toString () { return "(" + key () + " " + info + ")"; } } public class SymbolTable { private class Node { ITEM item; Node l, r; Node (ITEM x) { item = x; } } private boolean item_less (ITEM i1, ITEM i2) { return (i1.key ()).less(i2.key ()); } private boolean item_equals (ITEM i1, ITEM i2) { return (i1.key ()).equals(i2.key ()); } private Node head; SymbolTable (int maxN) { head = null; } private Node insertR(Node h, ITEM x) { if (null == h) return new Node (x); if (item_less(x, h.item)) h.l = insertR (h.l, x); else h.r = insertR (h.r, x); return h; } void insert (ITEM x) { head = insertR (head, x); } private ITEM searchR(Node h, KEY k) { if (null == h) return null; if (k.equals(h.item.key())) return h.item; if (k.less(h.item.key())) return searchR (h.l, k); else return searchR (h.r, k); } ITEM search (KEY k) { return searchR (head, k); } }