#include #define clr(x,y) memset(x,y,sizeof x) #define inf 0x3f3f3f3f using namespace std; struct Point { int x,y; }point[550],h[550]; struct Vec { int x,y; Vec(int _x,int _y):x(_x),y(_y){} }; int Cross(Vec a,Vec b) { return a.x*b.y - b.x*a.y; } int n,m,mp[550][550]; bool jgmid(Point a,Point b,Point c) { if (c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>= min(a.y,b.y)&&c.y<=max(a.y,b.y)) return true; else return false; } int main() { int n; while (scanf("%d",&n)!=EOF) { for (int i=1;i<=n;i++) scanf("%d%d",&h[i].x,&h[i].y); scanf("%d",&m); for (int i=1;i<=m;i++) scanf("%d%d",&point[i].x,&point[i].y); clr(mp,inf); for (int i=1;i<=m;i++) for (int j=1;j<=m;j++) { bool flag=true; int tmp; Vec l(point[i].x-point[j].x,point[i].y-point[j].y); for (int k=1;k<=n;k++) if ((tmp=Cross(l,Vec(point[i].x-h[k].x,point[i].y-h[k].y))) <0 || (tmp==0 && !jgmid(point[i],point[j],h[k]))) { flag=false;if(!flag)break;} if (flag) mp[i][j]=1; } for (int k=1;k<=m;k++) for (int i=1;i<=m;i++) if (mp[i][k]!=inf) for (int j=1;j<=m;j++) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); int res=inf; for (int i=1;i<=m;i++) res=min(res,mp[i][i]); if (res>=inf) printf("ToT\n"); else printf("%d\n",m-res); } return 0; }