#include<bits/stdc++.h> #define MAXN 100005 #define ll long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } structPoint{ ll x,y; }; inline ll operator * (const Point &A,const Point &B){ return A.x*B.y-A.y*B.x; } inline Point operator - (const Point &A,const Point &B){ return Point{A.x-B.x,A.y-B.y}; } inline Point operator + (const Point &A,const Point &B){ return Point{A.x+B.x,A.y+B.y}; } inlinedoubledis(const Point &A){ returnsqrt(A.x*A.x+A.y*A.y); } inlinebooloperator < (const Point &A,const Point &B){ ll ans=(A*B); if (ans!=0) return ans>0; elsereturndis(A)<dis(B); } Point stk[MAXN]; int top; structConvex{ Point A[MAXN]; int tot,pos; Convex(){pos=1;memset(A,0,sizeof(A));tot=0;} Point & operator[] (int pos){return A[pos];} inlinevoidInsert(Point P){ A[++tot]=P; if (A[pos].x>P.x||(A[pos].x==P.x&&A[pos].y>P.y)) pos=tot; } inlinevoidBuild(){//建立凸包 swap(A[1],A[pos]); for (registerint i=2;i<=tot;++i) A[i]=A[i]-A[1]; sort(A+2,A+1+tot); for (registerint i=2;i<=tot;++i) A[i]=A[i]+A[1]; top=0; for (registerint i=1;i<=tot;++i){ while (top>1&&(stk[top]-stk[top-1])*(A[i]-stk[top-1])<=0) top--; stk[++top]=A[i]; } memcpy(A,stk,sizeof(A)); tot=top; } inline Point Top(){//获取凸包上面最后一个元素 return A[tot]; } }F,S; Point s1[MAXN],s2[MAXN]; Point temp; inline Convex Minkowski(Convex X,Convex Y){ int n=X.tot,m=Y.tot; for (registerint i=1;i<n;++i) s1[i]=X[i+1]-X[i]; s1[n]=X[1]-X[n]; for (registerint i=1;i<m;++i) s2[i]=Y[i+1]-Y[i]; s2[m]=Y[1]-Y[m]; Convex Ans; Ans.Insert(X[1]+Y[1]); int j=1,k=1;//凸包归并 while (j<=n&&k<=m) Ans.Insert(Ans.Top()+(s1[j]*s2[k]>=0?s1[j++]:s2[k++])); while (j<=n) Ans.Insert(Ans.Top()+s1[j++]); while (k<=m) Ans.Insert(Ans.Top()+s2[k++]);
temp=Ans[1]; for (registerint i=Ans.tot;i>=1;--i){ Ans[i]=Ans[i]-temp; } return Ans; } Convex A; inlineboolInside(Point P){//判断P是否在凸包内 if (P*A[1]>0||A.Top()*P>0) returnfalse; int pos=lower_bound(A.A+1,A.A+1+A.tot,P)-A.A-1; return (P-A[pos])*(A[pos%A.tot+1]-A[pos])<=0; } intmain(){ int n=read(),m=read(),q=read(); for (registerint i=1;i<=n;++i){ int x=read(),y=read(); F.Insert(Point{x,y}); } for (registerint i=1;i<=m;++i){ int x=read(),y=read(); S.Insert(Point{-x,-y}); } F.Build(),S.Build(); A=Minkowski(F,S); A.Build(); while (q--){ int dx=read(),dy=read(); puts(Inside(Point{dx,dy}-temp)?"1":"0"); } }