#include<bits/stdc++.h>
using namespace std;
class BSTNode{
public:
double x,y;
string name;
BSTNode* lc;
BSTNode* rc;
BSTNode* par;
public:
BSTNode(){
lc = NULL;
rc = NULL;
par = NULL;
}
BSTNode(string _s ,double _x,double _y,BSTNode* fa){
lc = NULL;
rc = NULL;
par = fa;
name = _s;
x = _x;
y = _y;
}
void SetLeft(string _s,double _x,double _y){
BSTNode* tem = new BSTNode(_s, _x,_y,this);
lc = tem;
}
void SetRight(string _s,double _x,double _y){
BSTNode* tem = new BSTNode( _s, _x, _y,this);
rc = tem;
}
void insert(string _s,double _x,double _y){
if(_s < name){
if(lc == NULL) SetLeft( _s, _x, _y);
else lc->insert( _s, _x, _y);
}
else{
if(rc == NULL) SetRight( _s, _x, _y);
else rc->insert(_s, _x, _y);
}
}
BSTNode* getmin(){
if(lc == NULL) return this;
else return lc->getmin();
}
void dele(){
if(rc == NULL){
if(lc == NULL){
if(this == par->lc) par->lc = NULL;
else par->rc = NULL;
delete this;
return;
}
else{
BSTNode* tem = lc;
tem->par = par;
if(this == par->lc) par->lc = tem;
else par->rc = tem;
delete this;
return;
}
}
else{
BSTNode* tem = rc->getmin();
name = tem->name;
x = tem->x;
y = tem->y;
tem->dele();
}
}
bool findname(string fname,BSTNode*& ans ){
// cerr<<fname<<"GG"<<name<<endl;
if(fname == name){
ans = this;
// cerr<<"OK"<<ans->x<<' '<<ans->y<<endl;
return 1;
}
bool ok = 0;
if(lc != NULL && fname < name) ok = lc->findname(fname,ans);
if(ok) return 1;
if(rc != NULL ) ok = rc->findname(fname,ans);
return ok;
}
bool findxy(double fx,double fy,BSTNode*& ans){
if(x == fx && y == fy){
ans = this;
return 1;
}
else{
if(lc != NULL && lc->findxy(fx,fy,ans) ) return 1;
if(rc != NULL && rc->findxy(fx,fy,ans) ) return 1;
}
return 0;
}
void delename(string delname){
BSTNode* ans;
findname(delname,ans);
ans->dele();
}
bool delexy(double dx,double dy){
if(x == dx && y == dy){
dele();
return 1;
}
else{
if(lc != NULL && lc->delexy(dx,dy) ) return 1;
if(rc != NULL && rc->delexy(dx,dy) ) return 1;
}
return 0;
}
void print(double cx,double cy,double r){
if( (cx-x)*(cx - x) + (cy-y)*(cy - y) < r*r){
cout<<name<<' '<<x<<' '<<y<<endl;
}
if(lc != NULL) lc->print(cx,cy,r);
if(rc != NULL) rc->print(cx,cy,r);
}
void show(){
cout<<name<<' '<<x<<' '<<y<<endl;
return;
}
};
int main(){
BSTNode* root;
bool has = 0;
while(1){
int op;
printf("\ninsert enter 1\ndelete enter 2\nfind enter 3\nprint enter 4\n");
scanf("%d",&op);
switch(op){
case 1:{
cout<<"name and xy"<<endl;
string s; double xx,yy;
cin>>s>>xx>>yy;
if(!has){
has = 1;
root = new BSTNode(s,xx,yy,NULL);
}
else{
root->insert(s,xx,yy);
}
break;
}
case 2:{
int ty;
printf("key is name enter 1\nkey is ordinate enter 2\n");
scanf("%d",&ty);
if(ty == 1){
string delete_name;
printf("enter delete city's name\n");
cin>>delete_name;
root->delename(delete_name);
}
else{
int tx,ty;
printf("enter delete city's x and y\n");
cin>>tx>>ty;
root->delexy(tx,ty);
}
break;
}
case 3:{
int ty;
printf("key is name enter 1\nkey is ordinate enter 2\n");
scanf("%d",&ty);
if(ty == 1){
string find_name;
printf("enter find city's name\n");
cin>>find_name;
BSTNode* ans;
if(!(root->findname(find_name,ans))) cout<<"NOT FOUND"<<endl;
else{
ans->show();
}
}
else{
int tx,ty;
printf("enter find city's x and y\n");
cin>>tx>>ty;
BSTNode* ans;
if(!root->findxy(tx,ty,ans)) cout<<"NOT FOUND"<<endl;
else{
ans->show();
}
}
break;
}
case 4:{
cout<<"cx and xy and r"<<endl;
double cx,cy,r;
cin>>cx>>cy>>r;
root->print(cx,cy,r);
break;
}
}
}
return 0;
}