public IntTreeNode convert(int[] p_inputs, int p_start, int p_end) {
        IntTreeNode l_root = new IntTreeNode(p_inputs[p_end]);

        if (p_start == p_end) {
            return l_root;
        }

        int l_splitter = p_end - 1;
        for (; l_splitter >= p_start; l_splitter--) {
            if (p_inputs[l_splitter] <= l_root.getValue()) {
                break;
            }
        }

        if (p_start <= l_splitter) {
            IntTreeNode l_leftSub = convert(p_inputs, p_start, l_splitter);

            if (l_leftSub.getValue() >= l_root.getValue()) {
                throw new IllegalArgumentException();
            }

            l_root.setLeft(l_leftSub);
        }

        if (l_splitter <= p_end - 1) {
            IntTreeNode l_rightSub = convert(p_inputs, l_splitter + 1, p_end - 1);

            if (l_rightSub.getValue() <= l_root.getValue()) {
                throw new IllegalArgumentException();
            }

            l_root.setRight(l_rightSub);
        }

        return l_root;
    }