rt,题意是求距离给出点第 k 远的点的编号
但是测试点全WA了
#include<bits/stdc++.h>
#define MAXN 100002
#define MAXM 10002
#define int long long
using namespace std;
namespace FastIO
{
char buf[1<<23],*p1,*p2;
#define reg register
#ifdef ONLINE_JUDGE
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2))?EOF:*p1++
#else
#define gc() getchar()
#endif
inline int read()
{
reg int f=1,w=0;reg char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=gc();
return f*w;
}
}
using FastIO::read;
int n,m;
int ls[MAXN],rs[MAXN];
int L[MAXN],R[MAXN],D[MAXN],U[MAXN];
struct point
{
int x,y;
point(int _x,int _y){x=_x,y=_y;}
point(){}
}p[MAXN];
struct node
{
int id;
int dis;
node(int _id,int _dis){id=_id,dis=_dis;}
node(){}
};
inline bool operator<(node a,node b)
{
return a.dis>b.dis||(a.dis==b.dis&&a.id<b.id);
}
priority_queue<node>q;
inline int dis(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline void maintain(int x)
{
L[x]=R[x]=p[x].x,D[x]=U[x]=p[x].y;
if(ls[x])
{
L[x]=min(L[x],L[ls[x]]),R[x]=max(R[x],R[ls[x]]);
D[x]=min(D[x],D[ls[x]]),U[x]=max(U[x],U[ls[x]]);
}
if(rs[x])
{
L[x]=min(L[x],L[rs[x]]),R[x]=max(R[x],R[rs[x]]);
D[x]=min(D[x],D[rs[x]]),U[x]=max(U[x],U[rs[x]]);
}
return;
}
inline int build(int l,int r)
{
if(l>r)return 0;
if(l==r)
{
maintain(l);
return l;
}
int mid=l+r>>1;
double avx=0,avy=0,vax=0,vay=0;
for(int i=l;i<=r;i++)
avx+=p[i].x,avy+=p[i].y;
avx/=r-l+1,avy/=r-l+1;
for(int i=l;i<=r;i++)
vax+=(p[i].x-avx)*(p[i].x-avx),vay+=(p[i].y-avy)*(p[i].y-avy);
if(vax>=vay)nth_element(p+l,p+mid,p+r+1,[](point a,point b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;});
else nth_element(p+l,p+mid,p+r+1,[](point a,point b){if(a.y!=b.y)return a.y<b.y;return a.x<b.x;});
ls[mid]=build(l,mid-1);
rs[mid]=build(mid+1,r);
maintain(mid);
return mid;
}
inline int eval(point a,int x)
{
int res=0;
res=max(res,dis(a,point(L[x],D[x])));
res=max(res,dis(a,point(L[x],U[x])));
res=max(res,dis(a,point(R[x],D[x])));
res=max(res,dis(a,point(R[x],U[x])));
return res;
}
inline void query(int l,int r,point x)
{
if(l>r)return;
int mid=l+r>>1;
if(dis(p[mid],x)>q.top().dis||(dis(p[mid],x)==q.top().dis&&mid<q.top().id))
{
q.pop();
q.push(node(mid,dis(p[mid],x)));
}
if(l==r)return;
int lval=eval(x,ls[mid]),rval=eval(x,rs[mid]);
if(lval>=q.top().dis&&rval>=q.top().dis)
{
if(lval>rval)
{
query(l,mid-1,x);
query(mid+1,r,x);
}
else
{
query(mid+1,r,x);
query(l,mid-1,x);
}
}
else
{
if(lval>=q.top().dis)query(l,mid-1,x);
if(rval>=q.top().dis)query(mid+1,r,x);
}
return;
}
signed main()
{
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)
p[i].x=read(),p[i].y=read();
build(1,n);
m=read();
for(int i=1;i<=m;i++)
{
int px=read(),py=read(),k=read();
while(!q.empty())q.pop();
for(int j=1;j<=k;j++)q.push(node(-1,0));
query(1,n,point(px,py));
printf("%lld\n",q.top().id);
}
return 0;
}