import java.util.TreeMap;
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
{
System.
out.
println("Test Start!"); System.
out.
println("--------------");
IntervalDataSet data = new IntervalDataSet ();
data.insert(new Interval( 1,3, 0 ));
data.insert(new Interval( 2,4, 1 ));
data.insert(new Interval( 3,5, 3 ));
data.insert(new Interval( 4,6, 4 ));
System.
out.
println("initial values"); data.print();
System.
out.
println("--------------"); System.
out.
println("Intervals overlapping [2,3]");
data.printOverlappingIntervals(new Interval( 2,3, -1 ));
System.
out.
println("--------------");
System.
out.
println("change depth 0 to 2"); data.changeDepth( 0, 2 );
data.print();
System.
out.
println("--------------");
System.
out.
println("remove depth 4"); data.remove( 4 );
data.print();
System.
out.
println("--------------");
System.
out.
println("change depth 1 to 4"); data.changeDepth( 1, 4 );
data.print();
System.
out.
println("--------------");
System.
out.
println("Test End!"); }
}
class Interval
{
public int min;
public int max;
public int depth;
public Interval (int min, int max, int depth)
{
this.min = min;
this.max = max;
this.depth = depth;
}
public boolean intersect (Interval b)
{
return (b != null
&& ((this.min >= b.min && this.min <= b.max)
|| (this.max >= b.min && this.max <= b.max))
);
}
public void print ()
{
System.
out.
println(depth
+" => ["+min
+","+max
+"] "); }
}
class IntervalDataSet
{
private TreeMap
<Integer,Interval
> map
;
public IntervalDataSet ()
{
map
= new TreeMap
<Integer,Interval
> (); }
public void print ()
{
for(Map.
Entry<Integer,Interval
> entry
: map.
entrySet()) {
Interval value = entry.getValue();
System.
out.
println(key
+" => ["+value.
min+","+value.
max+"] "); }
}
public boolean changeDepth (int depth, int newDepth)
{
if (!map.containsKey(depth)) return false;
if (map.containsKey(newDepth)) return false;
Interval in = map.get(depth);
in.depth = newDepth;
remove(depth); insert(in);
return true;
}
public boolean insert (Interval in)
{
if (in == null) return false;
if (map.containsKey(in.depth)) return false;
map.put(in.depth, in); return true;
}
public boolean remove (int depth)
{
if (!map.containsKey(depth)) return false;
map.remove(depth); return true;
}
public Interval get (int depth)
{
return map.get(depth);
}
public void print (int depth)
{
if (!map.containsKey(depth))
System.
out.
println(depth
+" => X "); else
System.
out.
println(depth
+" => [" +map.get(depth).min+","+map.get(depth).max+"] ");
}
public void printOverlappingIntervals (Interval in)
{
for (Interval interval : map.values())
if (interval.intersect(in))
interval.print();
}
public ArrayList<Interval> getOverlappingIntervals (Interval in)
{
ArrayList<Interval> list = new ArrayList<Interval>();
for (Interval interval : map.values())
if (interval.intersect(in))
list.add(interval);
return list;
}
public int size ()
{
return map.size();
}
}
CmltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IFN0YXJ0ISIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0iKTsKCgkJSW50ZXJ2YWxEYXRhU2V0IGRhdGEgPSBuZXcgSW50ZXJ2YWxEYXRhU2V0ICgpOwoKCQlkYXRhLmluc2VydChuZXcgSW50ZXJ2YWwoIDEsMywgMCApKTsKCQlkYXRhLmluc2VydChuZXcgSW50ZXJ2YWwoIDIsNCwgMSApKTsKCQlkYXRhLmluc2VydChuZXcgSW50ZXJ2YWwoIDMsNSwgMyApKTsKCQlkYXRhLmluc2VydChuZXcgSW50ZXJ2YWwoIDQsNiwgNCApKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluaXRpYWwgdmFsdWVzIik7CiAgICAgICAgZGF0YS5wcmludCgpOwogICAgICAgIAoJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVydmFscyBvdmVybGFwcGluZyBbMiwzXSIpOwogICAgICAgIAoJCWRhdGEucHJpbnRPdmVybGFwcGluZ0ludGVydmFscyhuZXcgSW50ZXJ2YWwoIDIsMywgLTEgKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLSIpOwoKCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBkZXB0aCAwIHRvIDIiKTsKCQlkYXRhLmNoYW5nZURlcHRoKCAwLCAyICk7CiAgICAgICAgZGF0YS5wcmludCgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0iKTsKCgkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmUgZGVwdGggNCIpOwogICAgICAgIGRhdGEucmVtb3ZlKCA0ICk7CiAgICAgICAgZGF0YS5wcmludCgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0iKTsKCgkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgZGVwdGggMSB0byA0Iik7CiAgICAgICAgZGF0YS5jaGFuZ2VEZXB0aCggMSwgNCApOwogICAgICAgIGRhdGEucHJpbnQoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tIik7CiAgICAgICAgCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IEVuZCEiKTsKCX0KfQoKY2xhc3MgSW50ZXJ2YWwKewoJcHVibGljIGludCBtaW47CglwdWJsaWMgaW50IG1heDsKCXB1YmxpYyBpbnQgZGVwdGg7CgoJcHVibGljIEludGVydmFsIChpbnQgbWluLCBpbnQgbWF4LCBpbnQgZGVwdGgpCgl7CgkJdGhpcy5taW4gPSBtaW47CgkJdGhpcy5tYXggPSBtYXg7CgkJdGhpcy5kZXB0aCA9IGRlcHRoOwoJfQoKCXB1YmxpYyBib29sZWFuIGludGVyc2VjdCAoSW50ZXJ2YWwgYikKCXsKCQlyZXR1cm4gKGIgIT0gbnVsbAoJCQkmJiAoKHRoaXMubWluID49IGIubWluICYmIHRoaXMubWluIDw9IGIubWF4KQoJCQkJfHwgKHRoaXMubWF4ID49IGIubWluICYmIHRoaXMubWF4IDw9IGIubWF4KSkKCQkJKTsKCX0KCQoJcHVibGljIHZvaWQgcHJpbnQgKCkKICAgIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVwdGgrIiA9PiBbIittaW4rIiwiK21heCsiXSAiKTsKICAgIH0KfQoKY2xhc3MgSW50ZXJ2YWxEYXRhU2V0CnsKCXByaXZhdGUgVHJlZU1hcDxJbnRlZ2VyLEludGVydmFsPiBtYXA7CgoJcHVibGljIEludGVydmFsRGF0YVNldCAoKQoJewoJCW1hcCA9IG5ldyBUcmVlTWFwPEludGVnZXIsSW50ZXJ2YWw+ICgpOwoJfQoKICAgIHB1YmxpYyB2b2lkIHByaW50ICgpCiAgICB7CiAgICAgICAgZm9yKE1hcC5FbnRyeTxJbnRlZ2VyLEludGVydmFsPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKQogICAgICAgIHsKICAgICAgICAgIEludGVnZXIga2V5ID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICBJbnRlcnZhbCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAKICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihrZXkrIiA9PiBbIit2YWx1ZS5taW4rIiwiK3ZhbHVlLm1heCsiXSAiKTsKICAgICAgICB9CiAgICB9CgoJcHVibGljIGJvb2xlYW4gY2hhbmdlRGVwdGggKGludCBkZXB0aCwgaW50IG5ld0RlcHRoKQoJewoJCWlmICghbWFwLmNvbnRhaW5zS2V5KGRlcHRoKSkgcmV0dXJuIGZhbHNlOwoKCQlpZiAobWFwLmNvbnRhaW5zS2V5KG5ld0RlcHRoKSkgcmV0dXJuIGZhbHNlOwoKCQlJbnRlcnZhbCBpbiA9IG1hcC5nZXQoZGVwdGgpOwoKCQlpbi5kZXB0aCA9IG5ld0RlcHRoOwoKCQlyZW1vdmUoZGVwdGgpOyBpbnNlcnQoaW4pOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgYm9vbGVhbiBpbnNlcnQgKEludGVydmFsIGluKQoJewoJCWlmIChpbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CgoJCWlmIChtYXAuY29udGFpbnNLZXkoaW4uZGVwdGgpKSByZXR1cm4gZmFsc2U7CgoJCW1hcC5wdXQoaW4uZGVwdGgsIGluKTsgcmV0dXJuIHRydWU7Cgl9CgoJcHVibGljIGJvb2xlYW4gcmVtb3ZlIChpbnQgZGVwdGgpCgl7CgkJaWYgKCFtYXAuY29udGFpbnNLZXkoZGVwdGgpKSByZXR1cm4gZmFsc2U7CgoJCW1hcC5yZW1vdmUoZGVwdGgpOyByZXR1cm4gdHJ1ZTsKCX0KCiAgICBwdWJsaWMgSW50ZXJ2YWwgZ2V0IChpbnQgZGVwdGgpCiAgICB7CiAgICAgICAgcmV0dXJuIG1hcC5nZXQoZGVwdGgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHByaW50IChpbnQgZGVwdGgpCiAgICB7CiAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoZGVwdGgpKQogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlcHRoKyIgPT4gWCAiKTsKICAgICAgICBlbHNlCiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVwdGgrIiA9PiBbIgogICAgICAgICAgICArbWFwLmdldChkZXB0aCkubWluKyIsIittYXAuZ2V0KGRlcHRoKS5tYXgrIl0gIik7CiAgICB9CiAgICAKICAgIHB1YmxpYyB2b2lkIHByaW50T3ZlcmxhcHBpbmdJbnRlcnZhbHMgKEludGVydmFsIGluKQogICAgewogICAgICAgIGZvciAoSW50ZXJ2YWwgaW50ZXJ2YWwgOiBtYXAudmFsdWVzKCkpCiAgICAgICAgICAgIGlmIChpbnRlcnZhbC5pbnRlcnNlY3QoaW4pKQogICAgICAgICAgICAgICAgaW50ZXJ2YWwucHJpbnQoKTsKICAgIH0KCiAgICBwdWJsaWMgQXJyYXlMaXN0PEludGVydmFsPiBnZXRPdmVybGFwcGluZ0ludGVydmFscyAoSW50ZXJ2YWwgaW4pCiAgICB7CiAgICAgICAgQXJyYXlMaXN0PEludGVydmFsPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlcnZhbD4oKTsKCiAgICAgICAgZm9yIChJbnRlcnZhbCBpbnRlcnZhbCA6IG1hcC52YWx1ZXMoKSkKICAgICAgICAgICAgaWYgKGludGVydmFsLmludGVyc2VjdChpbikpCiAgICAgICAgICAgICAgICBsaXN0LmFkZChpbnRlcnZhbCk7CgogICAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIHB1YmxpYyBpbnQgc2l6ZSAoKQoJewoJCXJldHVybiBtYXAuc2l6ZSgpOwoJfQp9Cg==
Test Start!
--------------
initial values
0 => [1,3]
1 => [2,4]
3 => [3,5]
4 => [4,6]
--------------
Intervals overlapping [2,3]
0 => [1,3]
1 => [2,4]
3 => [3,5]
--------------
change depth 0 to 2
1 => [2,4]
2 => [1,3]
3 => [3,5]
4 => [4,6]
--------------
remove depth 4
1 => [2,4]
2 => [1,3]
3 => [3,5]
--------------
change depth 1 to 4
2 => [1,3]
3 => [3,5]
4 => [2,4]
--------------
Test End!