#include #include using namespace std; class CircleSet { friend istream &operator>>(istream &in, CircleSet &obj); private: struct Circle { long long x, y, r; Circle(long long _x = 0, long long _y = 0, long long _r = 0) : x(_x), y(_y), r(_r) {} }; int count; // 集合中圆的数目 Circle *circles; // 集合中所有圆 public: CircleSet(int n) : count(n) { circles = new Circle[n]; count = n; } ~CircleSet() { delete[] circles; } int operator[](int idx) const noexcept { return circles[idx].r; } bool checkContaining(int p, int q) { if (circles[p].r <= circles[q].r) return false; return (circles[p].x - circles[q].x) * (circles[p].x - circles[q].x) + (circles[p].y - circles[q].y) * (circles[p].y - circles[q].y) < (circles[p].r - circles[q].r) * (circles[p].r - circles[q].r); } int getCircleContainingQ(int q) { int res = -1; for (int p = 0; p < count; p++) { if (!checkContaining(p, q)) continue; if (res == -1) res = circles[p].r; else res = (circles[p].r < res) ? circles[p].r : res; } return res; } }; istream &operator>>(istream &in, CircleSet &obj) { for (int i = 0; i < obj.count; ++i) { in >> obj.circles[i].x >> obj.circles[i].y >> obj.circles[i].r; } return in; } int main() { #ifdef local freopen("pro.in", "r", stdin); #endif int n, m, type; cin >> n >> m; CircleSet set(n); cin >> set; // 输入集合中的所有圆 while (m--) { int type, p, q; cin >> type; if (type == 1) { // do nothing } else if (type == 2) { for (int i = 0; i < n; ++i) { cout << set[i] << ' '; } cout << endl; } else if (type == 3) { cin >> p >> q; cout << set.checkContaining(p, q) << endl; } else if (type == 4) { cin >> q; cout << set.getCircleContainingQ(q) << endl; } } return 0; }