#include #include #include #include #include #include #include using namespace std; const int maxn=50500; const double zero=1e-8; const double inf=1e10; int n,K,m,L,tot,root,ans; int E[maxn],pre[maxn],fst[maxn]; int V[maxn],ft[maxn],pl[maxn],pr[maxn],f[maxn][110],g[maxn][110],h[maxn],q[maxn]; struct Event { double x,y,r,px; int id,v; Event(){}; Event(double _x,double _y,double _r,double _px,int i,int _v) {x=_x; y=_y; r=_r; px=_px; id=i; v=_v;}; bool operator <(const Event &rhs)const { return px+zero=r) return y; double tmp=sqrt(r*r-(x-x0)*(x-x0)); if(v0==0) return y-tmp; else return y+tmp; } }Et[2*maxn]; struct Tree { int ft,lc,rc,x,v; void clear() {ft=lc=rc=x=v=0;} }tr[4*maxn]; struct Splay { void New(int i) { tr[++tot].clear(); tr[tot].x=i; tr[tot].v=0; tr[tot].rc=tot+1; pl[Et[i].id]=tot; tr[++tot].clear(); tr[tot].x=i; tr[tot].v=1; tr[tot].ft=tot-1; pr[Et[i].id]=tot; } void rotate(int x) { int y=tr[x].ft,z=tr[y].ft; if(tr[z].lc==y) tr[z].lc=x; else tr[z].rc=x; tr[x].ft=z; tr[y].ft=x; if(tr[y].lc==x) tr[y].lc=tr[x].rc,tr[tr[x].rc].ft=y,tr[x].rc=y; else tr[y].rc=tr[x].lc,tr[tr[x].lc].ft=y,tr[x].lc=y; } void splay(int x,int p) { int fa=tr[p].ft; while(tr[x].ft!=fa) { int y=tr[x].ft,z=tr[y].ft; if(z==fa) {rotate(x); continue;} if((tr[y].lc==x)^(tr[z].lc==y)) rotate(x); else rotate(y); rotate(x); } if(p==root) root=x; } int select(int i) { int p=root,ql=p,qr=p; double x=Et[i].px,y=Et[i].y; while(p>0) { int id=tr[p].x,v=tr[p].v; double y0; if(id==0) y0=v?inf:-inf; else y0=Et[id].gety(x,v); if(y0+zero1;i--) { int u=q[i]; h[u]=0; for(int j=1;j<=K;j++) f[u][j]=g[u][j]=V[u]; for(int k=fst[u];k;k=pre[k]) { for(int j=1;j