import java.util.*;
import java.lang.*;
import java.io.*;
class Test
{
static class Node<T>
{
Node<T> left, right;
T data;
int subtreeCount;
Node(T data) { this.data = data; subtreeCount = 1; }
public String toString
(int spaces,
char leftRight
) {
return String.
format("%" + spaces
+ "s%c: %s\n",
"", leftRight, data.
toString()) + (left != null ? left.toString(spaces+3, 'L') : "")
+ (right != null ? right.toString(spaces+3, 'R') : "");
}
int subtreeSize(Node<T> node)
{
if (node == null)
return 0;
return node.subtreeCount;
}
// combined add and get into 1 function for simplicity
// if data is null, it is an get, otherwise it's an add
private T addGet(int index, T data)
{
if (data != null)
subtreeCount++;
if (index == subtreeSize(left) && data == null)
return this.data;
if (index <= subtreeSize(left))
{
if (left == null && data != null)
return (left = new Node<>(data)).data;
else
return left.addGet(index, data);
}
else if (right == null && data != null)
return (right = new Node<>(data)).data;
else
return right.addGet(index-subtreeSize(left)-1, data);
}
}
static class TreeArray<T>
{
private Node<T> root;
public int size() { return (root == null ? 0 : root.subtreeCount); }
void add(int index, T data)
{
if (index < 0 || index > size())
if (root == null)
root = new Node<>(data);
else
root.addGet(index, data);
}
T get(int index)
{
if (index < 0 || index >= size())
return root.addGet(index, null);
}
@Override
public String toString
() { return root
== null ? "Empty" : root.
toString(1,
'X'); } }
public static void main
(String[] args
) {
TreeArray<String> tree = new TreeArray<>();
tree.add(0, "a");
tree.add(0, "b");
tree.add(1, "c");
tree.add(2, "d");
tree.add(1, "e");
tree.add(0, "f");
tree.add(6, "g");
tree.add(7, "h");
System.
out.
println("Tree view:"); System.
out.
println("Elements in order:"); for (int i = 0; i < tree.size(); i++)
System.
out.
println(i
+ ": " + tree.
get(i
)); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBUZXN0CnsKICAgc3RhdGljIGNsYXNzIE5vZGU8VD4KICAgewogICAgICBOb2RlPFQ+IGxlZnQsIHJpZ2h0OwogICAgICBUIGRhdGE7CiAgICAgIGludCBzdWJ0cmVlQ291bnQ7CiAgICAgIE5vZGUoVCBkYXRhKSB7IHRoaXMuZGF0YSA9IGRhdGE7IHN1YnRyZWVDb3VudCA9IDE7IH0KICAgICAgCiAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHNwYWNlcywgY2hhciBsZWZ0UmlnaHQpCiAgICAgIHsKICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUiICsgc3BhY2VzICsgInMlYzogJXNcbiIsICIiLCBsZWZ0UmlnaHQsIGRhdGEudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICArIChsZWZ0ICE9IG51bGwgPyBsZWZ0LnRvU3RyaW5nKHNwYWNlcyszLCAnTCcpIDogIiIpCiAgICAgICAgICAgICAgICAgKyAocmlnaHQgIT0gbnVsbCA/IHJpZ2h0LnRvU3RyaW5nKHNwYWNlcyszLCAnUicpIDogIiIpOwogICAgICB9CiAgICAgIAogICAgICBpbnQgc3VidHJlZVNpemUoTm9kZTxUPiBub2RlKQogICAgICB7CiAgICAgICAgIGlmIChub2RlID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gbm9kZS5zdWJ0cmVlQ291bnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC8vIGNvbWJpbmVkIGFkZCBhbmQgZ2V0IGludG8gMSBmdW5jdGlvbiBmb3Igc2ltcGxpY2l0eQogICAgICAvLyBpZiBkYXRhIGlzIG51bGwsIGl0IGlzIGFuIGdldCwgb3RoZXJ3aXNlIGl0J3MgYW4gYWRkCiAgICAgIHByaXZhdGUgVCBhZGRHZXQoaW50IGluZGV4LCBUIGRhdGEpCiAgICAgIHsKICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkKICAgICAgICAgICAgc3VidHJlZUNvdW50Kys7CiAgICAgICAgIGlmIChpbmRleCA9PSBzdWJ0cmVlU2l6ZShsZWZ0KSAmJiBkYXRhID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICAgICAgIGlmIChpbmRleCA8PSBzdWJ0cmVlU2l6ZShsZWZ0KSkKICAgICAgICAgewogICAgICAgICAgICBpZiAobGVmdCA9PSBudWxsICYmIGRhdGEgIT0gbnVsbCkKICAgICAgICAgICAgICAgcmV0dXJuIChsZWZ0ID0gbmV3IE5vZGU8PihkYXRhKSkuZGF0YTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICByZXR1cm4gbGVmdC5hZGRHZXQoaW5kZXgsIGRhdGEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKHJpZ2h0ID09IG51bGwgJiYgZGF0YSAhPSBudWxsKQogICAgICAgICAgICByZXR1cm4gKHJpZ2h0ID0gbmV3IE5vZGU8PihkYXRhKSkuZGF0YTsKICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gcmlnaHQuYWRkR2V0KGluZGV4LXN1YnRyZWVTaXplKGxlZnQpLTEsIGRhdGEpOwogICAgICB9CiAgIH0KICAgCiAgIHN0YXRpYyBjbGFzcyBUcmVlQXJyYXk8VD4KICAgewogICAgICBwcml2YXRlIE5vZGU8VD4gcm9vdDsKICAgICAgcHVibGljIGludCBzaXplKCkgeyByZXR1cm4gKHJvb3QgPT0gbnVsbCA/IDAgOiByb290LnN1YnRyZWVDb3VudCk7IH0KICAgICAgCiAgICAgIHZvaWQgYWRkKGludCBpbmRleCwgVCBkYXRhKQogICAgICB7CiAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBzaXplKCkpCiAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHNpemUoKSk7CiAgICAgICAgIGlmIChyb290ID09IG51bGwpCiAgICAgICAgICAgIHJvb3QgPSBuZXcgTm9kZTw+KGRhdGEpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgIHJvb3QuYWRkR2V0KGluZGV4LCBkYXRhKTsKICAgICAgfQogICAgICAKICAgICAgVCBnZXQoaW50IGluZGV4KQogICAgICB7CiAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKQogICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6ICIgKyBzaXplKCkpOwogICAgICAgICByZXR1cm4gcm9vdC5hZGRHZXQoaW5kZXgsIG51bGwpOwogICAgICB9CgogICAgICBAT3ZlcnJpZGUKICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHJvb3QgPT0gbnVsbCA/ICJFbXB0eSIgOiByb290LnRvU3RyaW5nKDEsICdYJyk7IH0KICAgfQoKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKICAgewogICAgICBUcmVlQXJyYXk8U3RyaW5nPiB0cmVlID0gbmV3IFRyZWVBcnJheTw+KCk7CiAgICAgIHRyZWUuYWRkKDAsICJhIik7CiAgICAgIHRyZWUuYWRkKDAsICJiIik7CiAgICAgIHRyZWUuYWRkKDEsICJjIik7CiAgICAgIHRyZWUuYWRkKDIsICJkIik7CiAgICAgIHRyZWUuYWRkKDEsICJlIik7CiAgICAgIHRyZWUuYWRkKDAsICJmIik7CiAgICAgIHRyZWUuYWRkKDYsICJnIik7CiAgICAgIHRyZWUuYWRkKDcsICJoIik7CiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJlZSB2aWV3OiIpOwogICAgICBTeXN0ZW0ub3V0LnByaW50KHRyZWUpOwogICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnRzIGluIG9yZGVyOiIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWUuc2l6ZSgpOyBpKyspCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpICsgIjogIiArIHRyZWUuZ2V0KGkpKTsKICAgfQp9