1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f3f3fll #define debug(x) cerr<<#x<<"="<<x<<endl using namespace std; using ll=long long; using ld=long double; using pli=pair<ll,int>; using pi=pair<int,int>; template<typename A> using vc=vector<A>; template<typename A,const int N> using aya=array<A,N>; inline int read() { int s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } inline ll lread() { ll s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } struct ques { ll k,b; int id; }b[1000005]; struct node { ll x,y; }a[12005]; ll mem[12005]; int qans[1000005]; int n,q,sq=1; inline ll ceil(ll x,ll y) { if(x>=0) return (x+y-1)/y; return -(-x/y); } inline ll get(int p) { int q=p+1; if(a[p].x>=a[q].x) return inf; return ceil(a[q].y-a[p].y,a[q].x-a[p].x); } set<pli>S; inline void ins(int p) { mem[p]=get(p); if(mem[p]!=inf) S.insert(pli(mem[p],p)); } inline void erase(int p) { if(mem[p]!=inf) S.erase(pli(mem[p],p)); } inline void run(int l,int r) { sort(a+l,a+r+1,[](node a,node b) { if(a.x!=b.x) return a.x<b.x; return a.y<b.y; }); S.clear(); for(int i=l;i<r;i++) ins(i);
for(int i=1;i<=q;i++) { while(S.size()&&S.begin()->first<=b[i].k) { int p=S.begin()->second;S.erase(S.begin()); swap(a[p],a[p+1]); if(p>l) erase(p-1),ins(p-1); if(p+1<r) erase(p+1),ins(p+1); } int L=l-1,R=r; while(L<R) { int mid=(L+R+1)>>1; if(a[mid].y<=b[i].k*a[mid].x+b[i].b) L=mid; else R=mid-1; } qans[b[i].id]+=L-l+1; } } int main() { n=read(),q=read(); while((sq+1)*(sq+1)<=q) sq++; for(int i=1;i<=n;i++) { ll X=lread(),Y=lread(); a[i].x=2*Y,a[i].y=X*X+Y*Y; } for(int i=1;i<=q;i++) { ll z=read(),r=read(); b[i].k=z,b[i].b=r*r-z*z,b[i].id=i; } sort(b+1,b+q+1,[](ques a,ques b){ return a.k<b.k;}); for(int l=1,r;l<=n;l=r) { r=min(n+1,l+sq); run(l,r-1); } for(int i=1;i<=q;i++) printf("%d\n",qans[i]); return 0; }
|