#include <bits/stdc++.h>
const int N = 100001;
const int Sqrt = 330;
std::vector<int> H, set[N];
int insec[N][Sqrt];
bool cnt[N][Sqrt];
long long sum[N], add[N], a[N];
void Go(int n, int m) {
  for (int i = 0; i < H.size(); i++) {
    int id = H[i];
    for (int j = 0; j < set[id].size(); j++) {
      cnt[set[id][j]][i] = true;
    }
  }
  for (int i = 0; i < m; i++) {
    int sz = set[i].size();
    for (int j = 0; j < sz; j++) {
      for (int k = 0; k < H.size(); k++) {
        insec[i][k] += cnt[set[i][j]][k];
      }
    }
  }
}
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i < n; i++) scanf("%I64d", a + i);
  for (int i = 0; i < m; i++) {
    int s, x;
    scanf("%d", &s);
    if (s >= Sqrt) H.push_back(i);
    for (int j = 0; j < s; j++) {
      scanf("%d", &x);
      x--;
      set[i].push_back(x);
      sum[i] += a[x];
    }
  }
  Go(n, m);
  for (int i = 0; i < q; i++) {
    char op;
    int k, val;
    scanf(" %c %d", &op, &k);
    k--;
    if (op == '+') {
      scanf("%d", &val);
      if (set[k].size() >= Sqrt) {
        add[k] += val;
        for (int j = 0; j < H.size(); j++)
          if (H[j] != k) {
            sum[H[j]] += val * (long long)insec[k][j];
          }
      } else {
        for (int j = 0; j < set[k].size(); j++) a[set[k][j]] += val;
        for (int j = 0; j < H.size(); j++)
          sum[H[j]] += val * (long long)insec[k][j];
      }
    } else {
      if (set[k].size() >= Sqrt) {
        printf("%I64d\n", add[k] * (long long)set[k].size() + sum[k]);
      } else {
        long long ans = 0;
        for (int j = 0; j < set[k].size(); j++) ans += a[set[k][j]];
        for (int j = 0; j < H.size(); j++) ans += add[H[j]] * insec[k][j];
        printf("%I64d\n", ans);
      }
    }
  }
  return 0;
}
