#include <iostream>
using namespace std;
// simple Point structure
template <typename T, typename U, typename V>
struct Point{
T x;
U y;
V z; // optional
/*
Point(){
x = T();
y = U();
z = V();
}*/
Point(T _x, U _y) {
x = _x;
y = _y;
}
Point(T _x, U _y, V _z){
x = _x;
y = _y;
z = _z;
}
inline bool equals(Point & p){
return(p.x == x && p.y == y);
}
};
// Rectangular Bounds for tree
// T,U should hold double or float only
template <typename T, typename U, typename V>
struct RectBounds {
// x, y center point
T x;
U y;
// dimension width w and height h
T w, h;
//constructors
// (_x, _y): center of rectangle bound. (_w, _h): width and height
RectBounds(T _x, U _y, T _w, T _h){
x = _x;
y = _y;
w = _w;
h = _h;
}
// returns true if point p is in Rect bounds, false otherwise
inline bool contains(Point<T, U, V> & p) {
float _w = w/2.0f;
float _h = h/2.0f;
return p.x >= x - _w && p.x < x + _w && p.y >= y - _h && p.y < y + _h;
}
// returns true if rectangle o intersects this, false otherwise
inline bool intersects( RectBounds & o){
float _w = w/2.0f;
float _h = h/2.0f;
return !(o.y + o.h/2.0f <= y - _h || o.y - o.h/2.0f >= y + _h || o.x + o.w/2.0f <= x - _w || o.x - o.w/2.0f >= x + _w);
}
};
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwovLyBzaW1wbGUgUG9pbnQgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN0cnVjdCBQb2ludHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgVCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIFUgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBWIHo7IC8vIG9wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBQb2ludCgpeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgeCA9IFQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIHkgPSBVKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB6ID0gVigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgfSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICBQb2ludChUIF94LCBVIF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHggPSBfeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB5ID0gX3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIFBvaW50KFQgX3gsIFUgX3ksIFYgX3opeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgeCA9IF94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHkgPSBfeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB6ID0gX3o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIGlubGluZSBib29sIGVxdWFscyhQb2ludCAmIHApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuKHAueCA9PSB4ICYmIHAueSA9PSB5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCn07ICAgCi8vIFJlY3Rhbmd1bGFyIEJvdW5kcyBmb3IgdHJlZQovLyBULFUgc2hvdWxkIGhvbGQgZG91YmxlIG9yIGZsb2F0IG9ubHkKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CnN0cnVjdCBSZWN0Qm91bmRzIHsKICAgIC8vIHgsIHkgY2VudGVyIHBvaW50ICAgCiAgICBUIHg7CiAgICBVIHk7CiAgICAvLyBkaW1lbnNpb24gd2lkdGggdyBhbmQgaGVpZ2h0IGgKICAgIFQgdywgaDsKCiAgICAvL2NvbnN0cnVjdG9ycwoKICAgIC8vIChfeCwgX3kpOiBjZW50ZXIgb2YgcmVjdGFuZ2xlIGJvdW5kLiAoX3csIF9oKTogd2lkdGggYW5kIGhlaWdodCAKICAgIFJlY3RCb3VuZHMoVCBfeCwgVSBfeSwgVCBfdywgVCBfaCl7CiAgICAgICAgeCA9IF94OwogICAgICAgIHkgPSBfeTsKICAgICAgICB3ID0gX3c7CiAgICAgICAgaCA9IF9oOwogICAgfQoKICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBwb2ludCBwIGlzIGluIFJlY3QgYm91bmRzLCBmYWxzZSBvdGhlcndpc2UKICAgIGlubGluZSBib29sIGNvbnRhaW5zKFBvaW50PFQsIFUsIFY+ICYgcCkgewogICAgICAgIGZsb2F0IF93ID0gdy8yLjBmOwogICAgICAgIGZsb2F0IF9oID0gaC8yLjBmOwogICAgICAgIHJldHVybiBwLnggPj0geCAtIF93ICYmIHAueCA8IHggKyBfdyAmJiBwLnkgPj0geSAtIF9oICYmIHAueSA8IHkgKyBfaDsKICAgIH0KCiAgICAvLyByZXR1cm5zIHRydWUgaWYgcmVjdGFuZ2xlIG8gaW50ZXJzZWN0cyB0aGlzLCBmYWxzZSBvdGhlcndpc2UKICAgIGlubGluZSBib29sIGludGVyc2VjdHMoIFJlY3RCb3VuZHMgJiBvKXsKICAgICAgICBmbG9hdCBfdyA9IHcvMi4wZjsKICAgICAgICBmbG9hdCBfaCA9IGgvMi4wZjsKICAgICAgICByZXR1cm4gIShvLnkgKyBvLmgvMi4wZiA8PSB5IC0gX2ggfHwgby55IC0gby5oLzIuMGYgPj0geSArIF9oIHx8IG8ueCArIG8udy8yLjBmIDw9IHggLSBfdyB8fCBvLnggLSBvLncvMi4wZiA+PSB4ICsgX3cpOwogICAgfSAKfTsKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=