类似于
不过因为距离相等的时候要优先选择序号小的,所以要重载一下运算符//minamoto#include#define R register#define ll long long#define inf 0x3f3f3f3f#define fp(i,a,b) for(R int i=a,I=b+1;i I;--i)#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)template inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}template inline bool cmax(T&a,const T&b){return a '9'||ch<'0')(ch=='-')&&(f=-1); for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0'); return res*f;}char sr[1<<21],z[20];int C=-1,Z=0;inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}void print(R int x){ if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x; while(z[++Z]=x%10+48,x/=10); while(sr[++C]=z[Z],--Z);sr[++C]='\n';}const int N=1e5+5;struct node{int v[2],mn[2],mx[2],l,r,id,idmn;}tr[N],S;int n,m,K,rt,k;inline bool operator <(const node &a,const node &b){return a.v[K] b.dis;}};priority_queue q;void upd(int p){ int l=tr[p].l,r=tr[p].r;tr[p].idmn=tr[p].id; if(l)cmin(tr[p].idmn,tr[l].idmn);if(r)cmin(tr[p].idmn,tr[r].idmn); fp(i,0,1){ tr[p].mn[i]=tr[p].mx[i]=tr[p].v[i]; if(l)cmin(tr[p].mn[i],tr[l].mn[i]),cmax(tr[p].mx[i],tr[l].mx[i]); if(r)cmin(tr[p].mn[i],tr[r].mn[i]),cmax(tr[p].mx[i],tr[r].mx[i]); }}int build(int l,int r,int k){ K=k;int mid=(l+r)>>1;nth_element(tr+l,tr+mid,tr+r+1); if(l q.top().dis||(dd==q.top().dis&&id dr){ if(dl>q.top().dis||(dl==q.top().dis&&tr[tr[p].l].idmn q.top().dis||(dr==q.top().dis&&tr[tr[p].r].idmn q.top().dis||(dr==q.top().dis&&tr[tr[p].r].idmn q.top().dis||(dl==q.top().dis&&tr[tr[p].l].idmn