#include <bits/stdc++.h>
using namespace std;
long long cx[100010], cy[100010], cr[100010];
long long px[100010], py[100010];
struct edges {
  int to, next;
} edge[1010];
const int DEG = 20;
struct trees {
  int fa[DEG];
  int head, deg;
} TREE[1010];
int L, fa[1010];
void add_edge(int u, int v) {
  edge[L].to = v;
  edge[L].next = TREE[u].head;
  TREE[u].head = L++;
  fa[v] = u;
}
struct states {
  int u, fu, deg;
};
void BFS(int s) {
  queue<states> que;
  states st;
  st.deg = 0;
  st.fu = st.u = s;
  que.push(st);
  while (!que.empty()) {
    states st = que.front();
    que.pop();
    TREE[st.u].deg = st.deg;
    TREE[st.u].fa[0] = st.fu;
    for (int i = 1; i < DEG; i++) TREE[st.u].fa[i] = s;
    for (int tmp = st.fu, num = 1; TREE[tmp].deg; tmp = TREE[st.u].fa[num++])
      TREE[st.u].fa[num] = TREE[tmp].fa[num - 1];
    for (int i = TREE[st.u].head; i != -1; i = edge[i].next) {
      int v = edge[i].to;
      states nst;
      nst.u = v;
      nst.fu = st.u;
      nst.deg = st.deg + 1;
      que.push(nst);
    }
  }
}
int LCA(int x, int y) {
  if (TREE[x].deg > TREE[y].deg) swap(x, y);
  int hx = TREE[x].deg, hy = TREE[y].deg;
  int tx = x, ty = y;
  for (int det = hy - hx, i = 0; det; det >>= 1, i++)
    if (det & 1) ty = TREE[ty].fa[i];
  if (tx == ty) return tx;
  for (int i = DEG - 1; i >= 0; i--) {
    if (TREE[tx].fa[i] == TREE[ty].fa[i]) continue;
    tx = TREE[tx].fa[i];
    ty = TREE[ty].fa[i];
  }
  return TREE[tx].fa[0];
}
int dep[1010];
inline bool belong(int a, int b) {
  if (cx[a] == cx[b] && cy[a] == cy[b]) {
    return cr[a] < cr[b];
  }
  if (cr[a] > cr[b]) return false;
  if ((cx[a] - cx[b]) * (cx[a] - cx[b]) + (cy[a] - cy[b]) * (cy[a] - cy[b]) <
      (cr[b] * cr[b]))
    return true;
  return false;
}
inline bool belong2(int x, int y, int b) {
  if ((x - cx[b]) * (x - cx[b]) + (y - cy[b]) * (y - cy[b]) < (cr[b] * cr[b]))
    return true;
  return false;
}
vector<int> es[1010];
int fat[1010], cc[100010];
int inque[1010];
void Gao(int id) {
  queue<int> que;
  que.push(id);
  dep[id] = 0;
  inque[id] = true;
  while (que.empty() == false) {
    int x = que.front();
    inque[x] = false;
    que.pop();
    for (int i = 0; i < es[x].size(); i++) {
      int y = es[x][i];
      if (dep[x] + 1 > dep[y]) {
        dep[y] = dep[x] + 1;
        if (dep[y] > 1010) return;
        fat[y] = x;
        if (inque[y] == false) {
          inque[y] = true;
          que.push(y);
        }
      }
    }
  }
}
int main() {
  L = 0;
  int n, cn, qn;
  scanf("%d%d%d", &n, &cn, &qn);
  int Root = cn;
  for (int i = 0; i <= cn; i++) TREE[i].head = -1;
  for (int i = 0; i < n; i++) scanf("%I64d%I64d", &px[i], &py[i]);
  for (int i = 0; i < cn; i++) {
    scanf("%I64d%I64d%I64d", &cr[i], &cx[i], &cy[i]);
  }
  for (int i = 0; i < cn; i++) es[cn].push_back(i);
  for (int i = 0; i < cn; i++)
    for (int j = 0; j < cn; j++) {
      if (i != j && belong(i, j)) {
        es[j].push_back(i);
      }
    }
  Gao(Root);
  for (int i = 0; i < cn; i++) {
    add_edge(fat[i], i);
  }
  BFS(Root);
  for (int i = 0; i < n; i++) {
    int mdep = 0;
    cc[i] = cn;
    for (int j = 0; j < cn; j++) {
      if (belong2(px[i], py[i], j)) {
        if (dep[j] > mdep) {
          mdep = dep[j];
          cc[i] = j;
        }
      }
    }
  }
  for (int i = 0; i < qn; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    a = cc[a];
    b = cc[b];
    int lca = LCA(a, b);
    printf("%d\n", dep[b] - dep[lca] + dep[a] - dep[lca]);
  }
  return 0;
}
