#include <bits/stdc++.h>
using namespace std;
struct pt {
  long long x, y;
  pt(long long x, long long y) : x(x), y(y) {}
  pt() : x(0), y(0) {}
  void read() { scanf("%I64d%I64d", &x, &y); }
  pt operator+(const pt& a) { return pt(a.x + x, a.y + y); }
  pt operator-(const pt& a) { return pt(x - a.x, y - a.y); }
  pt operator*(double k) { return pt(x * k, y * k); }
};
struct line {
  long long a, b, c;
  line(pt& p, pt& q) {
    a = p.y - q.y;
    b = q.x - p.x;
    c = -(a * p.x + b * p.y);
  }
};
double ang(const pt& p) { return atan2(p.y, p.x); }
int k, n, q;
const int N = 500 * 1000 + 5;
pt EV[N];
pt P[N];
pt V[N];
int T[N];
int CNT[N];
pt v[N];
bool cmp(const pt& a, const pt& b) { return ang(a) < ang(b); }
void read() {
  scanf("%d%d%d", &k, &n, &q);
  for (int i = 0; i < k; ++i) V[i].read();
  for (int i = 0; i < n; ++i) {
    P[i].read();
    scanf("%d", &CNT[i]);
  }
  for (int i = 0; i < q; ++i) {
    EV[i].read();
    scanf("%d", &T[i]);
  }
}
long long ans[N];
long long f[N];
void inc(int pos, int d) {
  for (; pos < N; pos |= pos + 1) f[pos] += d;
}
long long get(int pos) {
  long long res = 0;
  for (; pos >= 0; pos = (pos & (pos + 1)) - 1) res += f[pos];
  return res;
}
long long get(int l, int r) { return get(r) - get(l - 1); }
double PI = 3.1415926535897932384626433832795;
void solve() {
  for (int i = 0; i < k; ++i) {
    V[i] = V[i] * 2;
    V[i + k] = V[i] * -1;
  }
  sort(V, V + 2 * k, cmp);
  v[0] = pt(0, 0);
  for (int i = 1; i < 2 * k; ++i) v[i] = v[i - 1] + V[i - 1];
  pt c(0, 0);
  for (int i = 0; i < 2 * k; ++i) c = c + v[i];
  c = c * (1 / (2.0 * k));
  for (int i = 0; i < 2 * k; ++i) v[i] = v[i] - c;
  int sig[33];
  long long maxx = v[0].x;
  for (int i = 0; i < 2 * k; ++i) maxx = max(maxx, v[i].x);
  for (int _i = 0; _i < 2 * k; ++_i) {
    int _j = (_i + 1) % (2 * k);
    sig[_i] = 1;
    if (v[_i].x == v[_j].x) sig[_i] = 0;
    if (v[_i].x < v[_j].x) sig[_i] = -1;
  }
  for (int _i = 0; _i < 2 * k; ++_i) {
    vector<pair<long long, int> > ev;
    vector<long long> xs;
    memset(f, 0, sizeof f);
    int _j = (_i + 1) % (2 * k);
    line l(v[_i], v[_j]);
    double c = -l.a;
    if (l.b < 0) l.b *= -1, c *= -1;
    if (v[_i].x == v[_j].x) continue;
    for (int i = 0; i < n; ++i) {
      long long cy = P[i].y * l.b - P[i].x * c;
      if (sig[_i] == -1) cy++;
      ev.push_back(make_pair(cy, i));
      xs.push_back(P[i].x);
    }
    for (int i = 0; i < q; ++i) {
      pt p = EV[i] + v[_i] * T[i];
      long long cy = p.y * l.b - c * p.x;
      ev.push_back(make_pair(cy, i + n));
      xs.push_back(p.x);
      xs.push_back(p.x - 1);
      xs.push_back((EV[i] + v[_j] * T[i]).x);
      xs.push_back((EV[i] + v[_j] * T[i]).x - 1);
    }
    sort(ev.begin(), ev.end(),
         [](const pair<long long, int>& a, const pair<long long, int>& b) {
           if (a.first != b.first) return a.first < b.first;
           return a.second < b.second;
         });
    sort(xs.begin(), xs.end());
    xs.resize(unique(xs.begin(), xs.end()) - xs.begin());
    for (int i = 0; i < ev.size(); ++i) {
      if (ev[i].second < n) {
        int j = ev[i].second;
        inc(lower_bound(xs.begin(), xs.end(), P[j].x) - xs.begin(), CNT[j]);
      } else {
        int j = ev[i].second - n;
        pt p1 = EV[j] + v[_i] * T[j];
        pt p2 = EV[j] + v[_j] * T[j];
        if (p1.x > p2.x) swap(p1.x, p2.x);
        long long l = p1.x, r = p2.x;
        if (v[_i].x != maxx && v[_j].x != maxx) r--;
        ans[j] +=
            sig[_i] * get(lower_bound(xs.begin(), xs.end(), l) - xs.begin(),
                          lower_bound(xs.begin(), xs.end(), r) - xs.begin());
      }
    }
  }
  for (int i = 0; i < q; ++i) printf("%I64d\n", ans[i]);
}
int main() {
  srand(time(NULL));
  read();
  solve();
  return 0;
}
