import java.io.* ;
import java.util.* ;
class Ideone{
new Ideone( ) .run ( ) ;
}
void run( ) {
Scanner in
= new Scanner
( System .
in ) ; int numQueries = in.nextInt ( ) ;
for ( int i= 0 ; i< numQueries; i++ ) {
int type = in.nextInt ( ) ;
if ( type == 0 ) { // Add a point
double x = in.nextDouble ( ) ;
double y = in.nextDouble ( ) ;
root = addPoint( root, x, y, true ) ;
} else {
double x1 = in.nextDouble ( ) ;
double y1 = in.nextDouble ( ) ;
double x2 = in.nextDouble ( ) ;
double y2 = in.nextDouble ( ) ;
System .
out .
println ( "the points in between the rectange with end points " + printPointsInRange( root, x1, y1, x2, y2, true ) ;
}
}
}
// prints all points in the rectangle which has top left coordinates
// (x1, y1) and bottom right coordinates (x2, y2)
void printPointsInRange
( Point2D root,
double x1, double y1,
double x2, double y2, boolean vertical) {
if ( root== null ) {
return ;
}
double x = root.x ;
double y = root.y ;
boolean outsideRange
= Double .
compare ( x, x1
) < 0 || if ( ! outsideRange) {
}
if ( vertical) {
// root lies left of left boundary or on the boundary
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
} else if ( Double .
compare ( x, x2
) > 0 ) { // root lies right of right boundary
printPointsInRange( root.left , x1, y1, x2, y2, ! vertical) ;
} else if ( Double .
compare ( x, x2
) == 0 ) { // root lies on right boundary
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
} else {
// root lies in between x1 and x2
printPointsInRange( root.left , x1, y1, x2, y2, ! vertical) ;
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
}
} else {
// root lies below bottom boundary or on bottom boundary
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
} else if ( Double .
compare ( y, y1
) > 0 ) { // root lies above top boundary
printPointsInRange( root.left , x1, y1, x2, y2, ! vertical) ;
} else if ( Double .
compare ( y, y1
) == 0 ) { // root lies on top boundary
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
} else {
// root lies in between y1 and y2
printPointsInRange( root.left , x1, y1, x2, y2, ! vertical) ;
printPointsInRange( root.right , x1, y1, x2, y2, ! vertical) ;
}
}
}
if ( root== null ) {
}
if ( vertical) { // vertical division
double compare
= Double .
compare ( root.
x , x
) ; if ( compare< 0 ) { // point is on left of root
root.left = addPoint( root.left , x, y, ! vertical) ;
} else { // point is on right of root or on root's x
root.right = addPoint( root.right , x, y, ! vertical) ;
}
} else {
double compare
= Double .
compare ( y, root.
y ) ; if ( compare> 0 ) { // point is above the root
root.right = addPoint( root.right , x, y, ! vertical) ;
} else { // point is below the root or on root's y
root.left = addPoint( root.left , x, y, ! vertical) ;
}
}
return root;
}
}
double x;
double y;
public Point2D ( double x,
double y
) { this .x = x;
this .y = y;
right = left = null ;
}
return "( " + x + ", " + y + " )" ;
}
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgSWRlb25leyAKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257CgkJbmV3IElkZW9uZSgpLnJ1bigpOwoJfQoJCgl2b2lkIHJ1bigpewoJCVNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoJCWludCBudW1RdWVyaWVzID0gaW4ubmV4dEludCgpOwoJCVBvaW50MkQgcm9vdCA9IG51bGw7CgkJZm9yKGludCBpPTA7IGk8bnVtUXVlcmllczsgaSsrKXsKCQkJaW50IHR5cGUgPSBpbi5uZXh0SW50KCk7CgkJCWlmKHR5cGUgPT0gMCl7ICAgLy8gQWRkIGEgcG9pbnQKCQkJCWRvdWJsZSB4ID0gaW4ubmV4dERvdWJsZSgpOwoJCQkJZG91YmxlIHkgPSBpbi5uZXh0RG91YmxlKCk7CgkJCQlyb290ID0gYWRkUG9pbnQocm9vdCwgeCwgeSwgdHJ1ZSk7CgkJCX1lbHNlewoJCQkJZG91YmxlIHgxICA9IGluLm5leHREb3VibGUoKTsKCQkJCWRvdWJsZSB5MSA9IGluLm5leHREb3VibGUoKTsKCQkJCWRvdWJsZSB4MiAgPSBpbi5uZXh0RG91YmxlKCk7CgkJCQlkb3VibGUgeTIgPSBpbi5uZXh0RG91YmxlKCk7CgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoZSBwb2ludHMgaW4gYmV0d2VlbiB0aGUgcmVjdGFuZ2Ugd2l0aCBlbmQgcG9pbnRzICIgKyAKCQkJCSAgICAgbmV3IFBvaW50MkQoeDEsIHkxKSArICIgYW5kICIgKyBuZXcgUG9pbnQyRCh4MiwgeTIpICsgIiBhcmUgOiIpOwoJCQkJcHJpbnRQb2ludHNJblJhbmdlKHJvb3QsIHgxLCB5MSwgeDIsIHkyLCB0cnVlKTsKCQkJfQoJCX0KCX0KCQoJCgkvLyBwcmludHMgYWxsIHBvaW50cyBpbiB0aGUgcmVjdGFuZ2xlIHdoaWNoIGhhcyB0b3AgbGVmdCBjb29yZGluYXRlcwoJLy8gKHgxLCB5MSkgYW5kIGJvdHRvbSByaWdodCBjb29yZGluYXRlcyAoeDIsIHkyKQoJdm9pZCBwcmludFBvaW50c0luUmFuZ2UoUG9pbnQyRCByb290LAoJCQkJCQlkb3VibGUgeDEsIGRvdWJsZSB5MSwgCgkJCQkJCWRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIHZlcnRpY2FsKXsKCQlpZihyb290PT1udWxsKXsKCQkJcmV0dXJuOwoJCX0KCQlkb3VibGUgeCA9IHJvb3QueDsKCQlkb3VibGUgeSA9IHJvb3QueTsKCQlib29sZWFuIG91dHNpZGVSYW5nZSA9IERvdWJsZS5jb21wYXJlKHgsIHgxKTwwIHx8IAoJCQkJCQkJCURvdWJsZS5jb21wYXJlKHgsIHgyKT4wIHx8CgkJCQkJCQkJIERvdWJsZS5jb21wYXJlKHksIHkxKT4wIHx8IAoJCQkJCQkJCSBEb3VibGUuY29tcGFyZSh5LCB5Mik8MDsKCQlpZighb3V0c2lkZVJhbmdlKXsKCQkJU3lzdGVtLm91dC5wcmludGxuKHJvb3QpOwoJCX0KCQkKCQlpZih2ZXJ0aWNhbCl7CgkJCWlmKERvdWJsZS5jb21wYXJlKHgsIHgxKTw9MCl7IAoJCQkJLy8gcm9vdCBsaWVzIGxlZnQgb2YgbGVmdCBib3VuZGFyeSBvciBvbiB0aGUgYm91bmRhcnkKCQkJCXByaW50UG9pbnRzSW5SYW5nZShyb290LnJpZ2h0LCB4MSwgeTEsIHgyLCB5MiwgIXZlcnRpY2FsKTsKCQkJfWVsc2UgaWYoRG91YmxlLmNvbXBhcmUoeCwgeDIpPjApewoJCQkJLy8gcm9vdCBsaWVzIHJpZ2h0IG9mIHJpZ2h0IGJvdW5kYXJ5CgkJCQlwcmludFBvaW50c0luUmFuZ2Uocm9vdC5sZWZ0LCB4MSwgeTEsIHgyLCB5MiwgIXZlcnRpY2FsKTsKCQkJfWVsc2UgaWYoRG91YmxlLmNvbXBhcmUoeCwgeDIpPT0wKXsKCQkJCS8vIHJvb3QgbGllcyBvbiByaWdodCBib3VuZGFyeQoJCQkJcHJpbnRQb2ludHNJblJhbmdlKHJvb3QucmlnaHQsIHgxLCB5MSwgeDIsIHkyLCAhdmVydGljYWwpOwoJCQl9ZWxzZXsKCQkJCS8vIHJvb3QgbGllcyBpbiBiZXR3ZWVuIHgxIGFuZCB4MgoJCQkJcHJpbnRQb2ludHNJblJhbmdlKHJvb3QubGVmdCwgeDEsIHkxLCB4MiwgeTIsICF2ZXJ0aWNhbCk7CgkJCQlwcmludFBvaW50c0luUmFuZ2Uocm9vdC5yaWdodCwgeDEsIHkxLCB4MiwgeTIsICF2ZXJ0aWNhbCk7CgkJCX0KCQl9ZWxzZXsKCQkJaWYoRG91YmxlLmNvbXBhcmUoeSwgeTIpPD0wKXsgCgkJCQkvLyByb290IGxpZXMgYmVsb3cgYm90dG9tIGJvdW5kYXJ5IG9yIG9uIGJvdHRvbSBib3VuZGFyeQoJCQkJcHJpbnRQb2ludHNJblJhbmdlKHJvb3QucmlnaHQsIHgxLCB5MSwgeDIsIHkyLCAhdmVydGljYWwpOwoJCQl9ZWxzZSBpZihEb3VibGUuY29tcGFyZSh5LCB5MSk+MCl7CgkJCQkvLyByb290IGxpZXMgYWJvdmUgdG9wIGJvdW5kYXJ5CgkJCQlwcmludFBvaW50c0luUmFuZ2Uocm9vdC5sZWZ0LCB4MSwgeTEsIHgyLCB5MiwgIXZlcnRpY2FsKTsKCQkJfWVsc2UgaWYoRG91YmxlLmNvbXBhcmUoeSwgeTEpPT0wKXsKCQkJCS8vIHJvb3QgbGllcyBvbiB0b3AgYm91bmRhcnkKCQkJCXByaW50UG9pbnRzSW5SYW5nZShyb290LnJpZ2h0LCB4MSwgeTEsIHgyLCB5MiwgIXZlcnRpY2FsKTsKCQkJfWVsc2V7CgkJCQkvLyByb290IGxpZXMgaW4gYmV0d2VlbiB5MSBhbmQgeTIKCQkJCXByaW50UG9pbnRzSW5SYW5nZShyb290LmxlZnQsIHgxLCB5MSwgeDIsIHkyLCAhdmVydGljYWwpOwoJCQkJcHJpbnRQb2ludHNJblJhbmdlKHJvb3QucmlnaHQsIHgxLCB5MSwgeDIsIHkyLCAhdmVydGljYWwpOwoJCQl9CgkJfQoJfQoJCglQb2ludDJEIGFkZFBvaW50KFBvaW50MkQgcm9vdCwgZG91YmxlIHgsIGRvdWJsZSB5LCBib29sZWFuIHZlcnRpY2FsKXsKCQlpZihyb290PT1udWxsKXsKCQkJcmV0dXJuIG5ldyBQb2ludDJEKHgsIHkpOwoJCX0KCQlpZih2ZXJ0aWNhbCl7ICAgLy8gdmVydGljYWwgZGl2aXNpb24KCQkJZG91YmxlIGNvbXBhcmUgPSBEb3VibGUuY29tcGFyZShyb290LngsIHgpOwoJCQlpZihjb21wYXJlPDApeyAvLyBwb2ludCBpcyBvbiBsZWZ0IG9mIHJvb3QKCQkJCXJvb3QubGVmdCA9IGFkZFBvaW50KHJvb3QubGVmdCwgeCwgeSwgIXZlcnRpY2FsKTsKCQkJfWVsc2V7ICAgICAgICAvLyBwb2ludCBpcyBvbiByaWdodCBvZiByb290IG9yIG9uIHJvb3QncyB4CgkJCQlyb290LnJpZ2h0ID0gYWRkUG9pbnQocm9vdC5yaWdodCwgeCwgeSwgIXZlcnRpY2FsKTsKCQkJfQoJCX1lbHNlewoJCQlkb3VibGUgY29tcGFyZSA9IERvdWJsZS5jb21wYXJlKHksIHJvb3QueSk7CgkJCWlmKGNvbXBhcmU+MCl7ICAgIC8vIHBvaW50IGlzIGFib3ZlIHRoZSByb290CgkJCQlyb290LnJpZ2h0ID0gYWRkUG9pbnQocm9vdC5yaWdodCwgeCwgeSwgIXZlcnRpY2FsKTsKCQkJfWVsc2V7ICAgICAgICAgICAgLy8gcG9pbnQgaXMgYmVsb3cgdGhlIHJvb3Qgb3Igb24gcm9vdCdzIHkgCgkJCQlyb290LmxlZnQgPSBhZGRQb2ludChyb290LmxlZnQsIHgsIHksICF2ZXJ0aWNhbCk7CgkJCX0gCgkJfQoJCXJldHVybiByb290OwoJfQp9CgpjbGFzcyBQb2ludDJEewoJZG91YmxlIHg7Cglkb3VibGUgeTsKCVBvaW50MkQgcmlnaHQ7CglQb2ludDJEIGxlZnQ7CglwdWJsaWMgUG9pbnQyRChkb3VibGUgeCwgZG91YmxlIHkpewoJCXRoaXMueCA9IHg7CgkJdGhpcy55ID0geTsKCQlyaWdodCA9IGxlZnQgPSBudWxsOwoJfQoJCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CgkJcmV0dXJuICIoICIgKyB4ICsgIiwgIiArIHkgKyAiICkiOwoJfQp9