// author: Leonardone @ NEETSDKASU
import java.util.*;
import java.lang.*;
import java.io.*;
import java.nio.*;
class Ideone
{
{
final int TEST = 5000;
doIt(TEST, 10);
doIt(TEST, 8);
doIt(TEST, 5);
}
static void doIt(final int TEST, final int SIZEBIT) {
System.
out.
println(":::::::::::::::::::::"); System.
out.
println("TEST COUNT: " + TEST
); System.
out.
println("SIZEBIT: " + SIZEBIT
); System.
out.
println("SIZE: " + (1 << SIZEBIT
));
testFoo(TEST, SIZEBIT);
testArrayList(TEST, SIZEBIT);
testIntBuffer(TEST, SIZEBIT);
testArray(TEST, SIZEBIT);
}
static void testFoo(final int TEST, final int SIZEBIT) {
Foo foo = new Foo(SIZEBIT);
long t0, t1;
int sum;
for (int i = 0; i < TEST; i++) {
foo.put(i, i * 2);
}
System.
out.
println("foo addNew time: " + (t1
- t0
));
for (int i = 0; i < TEST; i++) {
foo.put(i, foo.get(i) * 3);
}
System.
out.
println("foo update time: " + (t1
- t0
));
sum = 0;
for (int i = 0; i < TEST; i++) {
sum += foo.get(i);
}
System.
out.
println("foo get time: " + (t1
- t0
)); System.
out.
println("foo sum: " + sum
); }
static void testArrayList(final int TEST, final int SIZEBIT) {
ArrayList<Integer> list = new ArrayList<>(1 << SIZEBIT);
long t0, t1;
int sum;
for (int i = 0; i < TEST; i++) {
list.add(i * 2);
}
System.
out.
println("list addNew time: " + (t1
- t0
));
for (int i = 0; i < TEST; i++) {
list.set(i, list.get(i) * 3);
}
System.
out.
println("list update time: " + (t1
- t0
));
sum = 0;
for (int i = 0; i < TEST; i++) {
sum += list.get(i);
}
System.
out.
println("list get time: " + (t1
- t0
)); System.
out.
println("list sum: " + sum
); }
static void testIntBuffer(final int TEST, final int SIZEBIT) {
IntBuffer ib = IntBuffer.allocate(1 << SIZEBIT);
long t0, t1;
int sum;
for (int i = 0; i < TEST; i++) {
if (i >= ib.limit()) {
ib
= IntBuffer.
wrap(Arrays.
copyOf(ib.
array(), ib.
limit() + (1 << SIZEBIT
))); }
ib.put(i, i * 2);
}
System.
out.
println("buffer addNew time: " + (t1
- t0
));
for (int i = 0; i < TEST; i++) {
ib.put(i, ib.get(i) * 3);
}
System.
out.
println("buffer update time: " + (t1
- t0
));
sum = 0;
for (int i = 0; i < TEST; i++) {
sum += ib.get(i);
}
System.
out.
println("buffer get time: " + (t1
- t0
)); System.
out.
println("buffer sum: " + sum
); }
static void testArray(final int TEST, final int SIZEBIT) {
int[] ia = new int[1 << SIZEBIT];
long t0, t1;
int sum;
for (int i = 0; i < TEST; i++) {
if (i >= ia.length) {
ia
= (Arrays.
copyOf(ia, ia.
length + (1 << SIZEBIT
))); }
ia[i] = i * 2;
}
System.
out.
println("array addNew time: " + (t1
- t0
));
for (int i = 0; i < TEST; i++) {
ia[i] = ia[i] * 3;
}
System.
out.
println("array update time: " + (t1
- t0
));
sum = 0;
for (int i = 0; i < TEST; i++) {
sum += ia[i];
}
System.
out.
println("array get time: " + (t1
- t0
)); System.
out.
println("array sum: " + sum
);
}
static class Foo
{
int size, mask, bit;
int[][] buf;
public Foo(int bit) {
this.bit = bit;
size = 1 << (bit & 0xF);
mask = size - 1;
buf = new int[1][];
buf[0] = new int[size];
}
public void put(int index, int value) {
int y = index >> bit;
if (y >= buf.length) {
buf
= Arrays.
copyOf(buf, y
+ 1); }
if (buf[y] == null) {
buf[y] = new int[size];
}
buf[y][index & mask] = value;
}
public int get(int index) {
int y = index >> bit;
if (y < buf.length) {
if (buf[y] != null) {
return buf[y][index & mask];
}
}
return 0;
}
}
}
Ly8gYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLm5pby4qOwoKY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCWZpbmFsIGludCBURVNUID0gNTAwMDsKCQkKCQlkb0l0KFRFU1QsIDEwKTsKCQlkb0l0KFRFU1QsIDgpOwoJCWRvSXQoVEVTVCwgNSk7CgkJCgl9CgkKCXN0YXRpYyB2b2lkIGRvSXQoZmluYWwgaW50IFRFU1QsIGZpbmFsIGludCBTSVpFQklUKSB7CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCI6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoiKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRFU1QgQ09VTlQ6ICIgKyBURVNUKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNJWkVCSVQ6ICIgKyBTSVpFQklUKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNJWkU6ICIgKyAoMSA8PCBTSVpFQklUKSk7CgkJU3lzdGVtLm91dC5mbHVzaCgpOwoJCQoJCXRlc3RGb28oVEVTVCwgU0laRUJJVCk7CgkJdGVzdEFycmF5TGlzdChURVNULCBTSVpFQklUKTsKCQl0ZXN0SW50QnVmZmVyKFRFU1QsIFNJWkVCSVQpOwoJCXRlc3RBcnJheShURVNULCBTSVpFQklUKTsKCX0KCQoJc3RhdGljIHZvaWQgdGVzdEZvbyhmaW5hbCBpbnQgVEVTVCwgZmluYWwgaW50IFNJWkVCSVQpIHsKCQlGb28gZm9vID0gbmV3IEZvbyhTSVpFQklUKTsKCQlsb25nIHQwLCB0MTsKCQlpbnQgc3VtOwoKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVDsgaSsrKSB7CgkJCWZvby5wdXQoaSwgaSAqIDIpOwoJCX0KCQl0MSA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiZm9vIGFkZE5ldyB0aW1lOiAgICAiICsgKHQxIC0gdDApKTsKCQlTeXN0ZW0ub3V0LmZsdXNoKCk7CgoJCXQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUOyBpKyspIHsKCQkJZm9vLnB1dChpLCBmb28uZ2V0KGkpICogMyk7CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJmb28gdXBkYXRlIHRpbWU6ICAgICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQuZmx1c2goKTsKCQkKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCXN1bSA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUOyBpKyspIHsKCQkJc3VtICs9IGZvby5nZXQoaSk7CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJmb28gZ2V0IHRpbWU6ICAgICAgICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiZm9vIHN1bTogICAgICAgICAgICAiICsgc3VtKTsKCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Cgl9CgkKCXN0YXRpYyB2b2lkIHRlc3RBcnJheUxpc3QoZmluYWwgaW50IFRFU1QsIGZpbmFsIGludCBTSVpFQklUKSB7CgkJQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oMSA8PCBTSVpFQklUKTsKCQlsb25nIHQwLCB0MTsKCQlpbnQgc3VtOwoKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVDsgaSsrKSB7CgkJCWxpc3QuYWRkKGkgKiAyKTsKCQl9CgkJdDEgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oImxpc3QgYWRkTmV3IHRpbWU6ICAgIiArICh0MSAtIHQwKSk7CgkJU3lzdGVtLm91dC5mbHVzaCgpOwoKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVDsgaSsrKSB7CgkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkpICogMyk7CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJsaXN0IHVwZGF0ZSB0aW1lOiAgICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQuZmx1c2goKTsKCQkKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCXN1bSA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUOyBpKyspIHsKCQkJc3VtICs9IGxpc3QuZ2V0KGkpOwoJCX0KCQl0MSA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigibGlzdCBnZXQgdGltZTogICAgICAiICsgKHQxIC0gdDApKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oImxpc3Qgc3VtOiAgICAgICAgICAgIiArIHN1bSk7CQkKCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Cgl9CgoJc3RhdGljIHZvaWQgdGVzdEludEJ1ZmZlcihmaW5hbCBpbnQgVEVTVCwgZmluYWwgaW50IFNJWkVCSVQpIHsKCQlJbnRCdWZmZXIgaWIgPSBJbnRCdWZmZXIuYWxsb2NhdGUoMSA8PCBTSVpFQklUKTsKCQlsb25nIHQwLCB0MTsKCQlpbnQgc3VtOwoKCQl0MCA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVDsgaSsrKSB7CgkJCWlmIChpID49IGliLmxpbWl0KCkpIHsKCQkJCWliID0gSW50QnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZihpYi5hcnJheSgpLCBpYi5saW1pdCgpICsgKDEgPDwgU0laRUJJVCkpKTsKCQkJfQoJCQlpYi5wdXQoaSwgaSAqIDIpOwoJCX0KCQl0MSA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVmZmVyIGFkZE5ldyB0aW1lOiAiICsgKHQxIC0gdDApKTsKCQlTeXN0ZW0ub3V0LmZsdXNoKCk7CgoJCXQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUOyBpKyspIHsKCQkJaWIucHV0KGksIGliLmdldChpKSAqIDMpOwoJCX0KCQl0MSA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVmZmVyIHVwZGF0ZSB0aW1lOiAiICsgKHQxIC0gdDApKTsKCQlTeXN0ZW0ub3V0LmZsdXNoKCk7CgkJCgkJdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlzdW0gPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgVEVTVDsgaSsrKSB7CgkJCXN1bSArPSBpYi5nZXQoaSk7CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJidWZmZXIgZ2V0IHRpbWU6ICAgICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVmZmVyIHN1bTogICAgICAgICAiICsgc3VtKTsJCgkJU3lzdGVtLm91dC5mbHVzaCgpOwoJfQoJCQoJc3RhdGljIHZvaWQgdGVzdEFycmF5KGZpbmFsIGludCBURVNULCBmaW5hbCBpbnQgU0laRUJJVCkgewoJCWludFtdIGlhID0gbmV3IGludFsxIDw8IFNJWkVCSVRdOwoJCWxvbmcgdDAsIHQxOwoJCWludCBzdW07CgoJCXQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUOyBpKyspIHsKCQkJaWYgKGkgPj0gaWEubGVuZ3RoKSB7CgkJCQlpYSA9IChBcnJheXMuY29weU9mKGlhLCBpYS5sZW5ndGggKyAoMSA8PCBTSVpFQklUKSkpOwoJCQl9CgkJCWlhW2ldID0gaSAqIDI7CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJhcnJheSBhZGROZXcgdGltZTogICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQuZmx1c2goKTsKCgkJdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1Q7IGkrKykgewoJCQlpYVtpXSA9IGlhW2ldICogMzsKCQl9CgkJdDEgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oImFycmF5IHVwZGF0ZSB0aW1lOiAgIiArICh0MSAtIHQwKSk7CgkJU3lzdGVtLm91dC5mbHVzaCgpOwoJCQoJCXQwID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJc3VtID0gMDsKCQlmb3IgKGludCBpID0gMDsgaSA8IFRFU1Q7IGkrKykgewoJCQlzdW0gKz0gaWFbaV07CgkJfQoJCXQxID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJhcnJheSBnZXQgdGltZTogICAgICIgKyAodDEgLSB0MCkpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiYXJyYXkgc3VtOiAgICAgICAgICAiICsgc3VtKTsJCgkJU3lzdGVtLm91dC5mbHVzaCgpOwoKCX0KCQoJc3RhdGljIGNsYXNzIEZvbwoJewoJCWludCBzaXplLCBtYXNrLCBiaXQ7CgkJaW50W11bXSBidWY7CgkJcHVibGljIEZvbyhpbnQgYml0KSB7CgkJCXRoaXMuYml0ID0gYml0OwoJCQlzaXplID0gMSA8PCAoYml0ICYgMHhGKTsKCQkJbWFzayA9IHNpemUgLSAxOwoJCQlidWYgPSBuZXcgaW50WzFdW107CgkJCWJ1ZlswXSA9IG5ldyBpbnRbc2l6ZV07CgkJfQoJCXB1YmxpYyB2b2lkIHB1dChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewoJCQlpbnQgeSA9IGluZGV4ID4+IGJpdDsKCQkJaWYgKHkgPj0gYnVmLmxlbmd0aCkgewoJCQkJYnVmID0gQXJyYXlzLmNvcHlPZihidWYsIHkgKyAxKTsKCQkJfQoJCQlpZiAoYnVmW3ldID09IG51bGwpIHsKCQkJCWJ1Zlt5XSA9IG5ldyBpbnRbc2l6ZV07CgkJCX0KCQkJYnVmW3ldW2luZGV4ICYgbWFza10gPSB2YWx1ZTsKCQl9CgkJcHVibGljIGludCBnZXQoaW50IGluZGV4KSB7CgkJCWludCB5ID0gaW5kZXggPj4gYml0OwoJCQlpZiAoeSA8IGJ1Zi5sZW5ndGgpIHsKCQkJCWlmIChidWZbeV0gIT0gbnVsbCkgewoJCQkJCXJldHVybiBidWZbeV1baW5kZXggJiBtYXNrXTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gMDsKCQl9Cgl9Cn0=