2016 ICPC Qingdao K
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1ll<<60;
struct node{
int d[3],ma[3],mi[3],l,r,id;
}T[200003];
int rt,n,m,cmp_d;
inline bool cmp(node a,node b){
return a.d[cmp_d]<b.d[cmp_d];
}
inline void up(int u,int v){
T[u].ma[0]=max(T[u].ma[0],T[v].ma[0]);
T[u].ma[1]=max(T[u].ma[1],T[v].ma[1]);
T[u].ma[2]=max(T[u].ma[2],T[v].ma[2]);
T[u].mi[0]=min(T[u].mi[0],T[v].mi[0]);
T[u].mi[1]=min(T[u].mi[1],T[v].mi[1]);
T[u].mi[2]=min(T[u].mi[2],T[v].mi[2]);
}
inline int build(int l,int r,int D){
int mid=(l+r)>>1;
cmp_d=D;
nth_element(T+l,T+mid,T+r+1,cmp);
T[mid].ma[0]=T[mid].mi[0]=T[mid].d[0];
T[mid].ma[1]=T[mid].mi[1]=T[mid].d[1];
T[mid].ma[2]=T[mid].mi[2]=T[mid].d[2];
if(l!=mid){
T[mid].l=build(l,mid-1,(D+1)%3);
up(mid,T[mid].l);
}
if(r!=mid){
T[mid].r=build(mid+1,r,(D+1)%3);
up(mid,T[mid].r);
}
return mid;
}
ll dis;
int ans;
int x,y,c;
//估计范围
inline ll getdis(int p){
ll ret=0;
if(T[p].mi[2]>c)return INF;
if(x>T[p].ma[0])ret+=1ll*(x-T[p].ma[0])*(x-T[p].ma[0]);
if(x<T[p].mi[0])ret+=1ll*(T[p].mi[0]-x)*(T[p].mi[0]-x);
if(y>T[p].ma[1])ret+=1ll*(y-T[p].ma[1])*(y-T[p].ma[1]);
if(y<T[p].mi[1])ret+=1ll*(T[p].mi[1]-y)*(T[p].mi[1]-y);
return ret;
}
inline void query(int p){
ll d0=1ll*(x-T[p].d[0])*(x-T[p].d[0])+1ll*(y-T[p].d[1])*(y-T[p].d[1]);
if(T[p].d[2]>c)d0=INF;
if(d0<dis||(d0==dis&&T[p].id<T[ans].id)){
dis=d0;
ans=p;
}
ll dl=INF,dr=INF;
if(T[p].l)dl=getdis(T[p].l);
if(T[p].r)dr=getdis(T[p].r);
if(dl<dr){
if(dl<=dis)query(T[p].l);
if(dr<=dis)query(T[p].r);
}
else {
if(dr<=dis)query(T[p].r);
if(dl<=dis)query(T[p].l);
}
}
int main(){
int tt;
scanf("%d",&tt);
while(tt--){
memset(T,0,sizeof(T));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&T[i].d[0],&T[i].d[1],&T[i].d[2]);
T[i].id=i;
}
rt=build(1,n,0);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
ans=0;
dis=INF;
query(rt);
printf("%d %d %d\n",T[ans].d[0],T[ans].d[1],T[ans].d[2]);
}
}
}