#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
long long POWER[65];
long long power(long long a, long long b) {
  long long ret = 1;
  while (b) {
    if (b & 1) ret *= a;
    a *= a;
    if (ret >= MOD) ret %= MOD;
    if (a >= MOD) a %= MOD;
    b >>= 1;
  }
  return ret;
}
long long inv(long long x) { return power(x, MOD - 2); }
void precompute() {
  POWER[0] = 1;
  for (int i = 1; i < 63; i++) POWER[i] = POWER[i - 1] << 1LL;
}
const int MAXN = 2e3 + 3;
long long answer[MAXN][MAXN];
bool on[MAXN];
int x[MAXN][MAXN], y[MAXN][MAXN], z[MAXN][MAXN];
int len[MAXN];
int vec[MAXN];
char str[20];
long long BIT[MAXN][MAXN];
struct node {
  bool is;
  int x1, x2, y1, y2;
};
const int MAXQ = 1e6 + 3;
int rev[MAXQ];
struct node que[MAXQ];
int n, m;
struct node newNode(bool is, int x1, int y1, int x2, int y2) {
  struct node ret;
  ret.is = is;
  ret.x1 = x1;
  ret.x2 = x2;
  ret.y1 = y1;
  ret.y2 = y2;
  return ret;
}
void update(int idx, int idy, long long val) {
  while (idx <= n) {
    int c = idy;
    while (c <= m) {
      BIT[idx][c] += val;
      c += (c & -c);
    }
    idx += (idx & -idx);
  }
}
long long query(int idx, int idy) {
  long long ret = 0;
  while (idx) {
    int c = idy;
    while (c) {
      ret += BIT[idx][c];
      c -= (c & -c);
    }
    idx -= (idx & -idx);
  }
  return ret;
}
int main() {
  int k;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= k; i++) {
    scanf("%d", &len[i]);
    for (int j = 1; j <= len[i]; j++) {
      scanf("%d%d%d", &x[i][j], &y[i][j], &z[i][j]);
    }
  }
  int q;
  scanf("%d", &q);
  int c = 0;
  for (int i = 1; i <= q; i++) {
    scanf("%s", str + 1);
    if (str[1] == 'S') {
      int xx;
      scanf("%d", &xx);
      que[i] = newNode(false, xx, 0, 0, 0);
    } else {
      int x1, y1, x2, y2;
      scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
      que[i] = newNode(true, x1, y1, x2, y2);
      vec[c++] = i;
      rev[i] = c - 1;
    }
  }
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= len[i]; j++) {
      update(x[i][j], y[i][j], z[i][j]);
    }
    for (int j = 0; j < c; j++) {
      int x1 = que[vec[j]].x1;
      int x2 = que[vec[j]].x2;
      int y1 = que[vec[j]].y1;
      int y2 = que[vec[j]].y2;
      long long v = query(x2, y2) - query(x1 - 1, y2) - query(x2, y1 - 1) +
                    query(x1 - 1, y1 - 1);
      answer[i][j] = v;
    }
    for (int j = 1; j <= len[i]; j++) {
      update(x[i][j], y[i][j], -z[i][j]);
    }
  }
  for (int i = 1; i <= k; i++) on[i] = true;
  for (int i = 1; i <= q; i++) {
    if (que[i].is) {
      long long ans = 0;
      for (int j = 1; j <= k; j++) {
        if (on[j]) ans += answer[j][rev[i]];
      }
      printf("%lld\n", ans);
    } else {
      on[que[i].x1] ^= 1;
    }
  }
  return 0;
}
