#include <bits/stdc++.h>
using namespace std;
void readi(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
void readll(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
void readc(char &x) {
  char c;
  while ((c = getchar()) && (c == ' ' || c == '\n'))
    ;
  x = c;
}
void writes(string s) { puts(s.c_str()); }
void writeln() { writes(""); }
void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
  writeln();
}
inline long long inc(int &x) { return ++x; }
inline long long inc(long long &x) { return ++x; }
inline long long inc(int &x, long long y) { return x += y; }
inline long long inc(long long &x, long long y) { return x += y; }
inline double inc(double &x, double y) { return x += y; }
inline long long dec(int &x) { return --x; }
inline long long dec(long long &x) { return --x; }
inline long long dec(int &x, long long y) { return x -= y; }
inline long long dec(long long &x, long long y) { return x -= y; }
inline double dec(double &x, double y) { return x -= y; }
inline long long mul(int &x) { return x = ((long long)x) * x; }
inline long long mul(long long &x) { return x = x * x; }
inline long long mul(int &x, long long y) { return x *= y; }
inline long long mul(long long &x, long long y) { return x *= y; }
inline double mul(double &x, double y) { return x *= y; }
inline long long divi(const int &x) {
  long long ans, l, r, mid;
  ans = 0;
  l = 0;
  r = 0x3fffffff;
  while (l < r) {
    mid = (l + r) / 2;
    if (mid * mid <= x) {
      ans = mid;
      l = mid + 1;
    } else
      r = mid;
  }
  return ans;
}
inline long long divi(const long long &x) {
  long long ans, l, r, mid;
  ans = 0;
  l = 0;
  r = 0x3fffffff;
  while (l < r) {
    mid = (l + r) / 2;
    if (mid * mid <= x) {
      ans = mid;
      l = mid + 1;
    } else
      r = mid;
  }
  return ans;
}
inline long long divi(int &x, long long y) { return x /= y; }
inline long long divi(long long &x, long long y) { return x /= y; }
inline double divi(double &x, double y) { return x /= y; }
inline long long mod(int &x, long long y) { return x %= y; }
inline long long mod(long long &x, long long y) { return x %= y; }
long long n, m, q, i, j, k, typ[100005], num[100005], sum[100005], ans[100005],
    x, y;
int ml[100005][455];
vector<long long> ind[100005], bg, sm, hv[100005];
char op;
int main() {
  readll(n);
  readll(m);
  readll(q);
  if ((1) <= ((n)))
    for (((i)) = (1); ((i)) <= ((n)); ((i))++) readll(num[i]);
  if ((1) <= ((m)))
    for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
      readll(x);
      if (x > 450) {
        typ[i] = 1;
        bg.push_back(i);
      } else {
        typ[i] = 0;
        sm.push_back(i);
      }
      if ((1) <= ((x)))
        for (((j)) = (1); ((j)) <= ((x)); ((j))++) {
          readll(y);
          ind[i].push_back(y);
          ans[i] += num[y];
          if (typ[i]) hv[y].push_back(bg.size() - 1);
        }
    }
  if ((1) <= ((n)))
    for (((j)) = (1); ((j)) <= ((n)); ((j))++) {
      for (k = 0; k < ind[j].size(); k++) {
        long long t = ind[j][k];
        for (i = 0; i < hv[t].size(); i++) ml[j][hv[t][i]]++;
      }
    }
  for (i = 0; i < bg.size(); i++) ml[bg[i]][i] = 0;
  while (q--) {
    readc(op);
    if (op == '?') {
      readll(x);
      if (typ[x] == 1) {
        long long s = 0;
        for (i = 0; i < bg.size(); i++) s += ml[x][i] * sum[bg[i]];
        writell(ans[x] + sum[x] * ind[x].size() + s);
      } else {
        long long s = 0;
        for (i = 0; i < bg.size(); i++) s += ml[x][i] * sum[bg[i]];
        for (i = 0; i < ind[x].size(); i++) {
          s += num[ind[x][i]];
        }
        writell(s);
      }
    } else {
      readll(x);
      readll(y);
      if (typ[x] == 1) {
        sum[x] += y;
      } else {
        for (i = 0; i < ind[x].size(); i++) num[ind[x][i]] += y;
        for (i = 0; i < bg.size(); i++) ans[bg[i]] += ml[x][i] * y;
      }
    }
  }
  return 0;
}
