#include using namespace std; using ll = long long; const int INF = 1e9 + 10; const ll INFL = 4e18; struct Query { int type; int u, v, add; int p, a; int c; }; int main() { ios::sync_with_stdio(false), cin.tie(nullptr); int N, M; cin >> N >> M; vector> G(N); for (int i = 0; i < M; i++) { int u, v; cin >> u >> v; u--, v--; G[u].insert(v), G[v].insert(u); } vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; vector sum(N); for (int i = 0; i < N; i++) for (int j : G[i]) sum[i] += A[j]; int Q; cin >> Q; const int B = max(1, (int)(sqrt(Q) / 2)); for (int qb = 0; qb * B < Q; qb++) { int q = min(Q, (qb + 1) * B) - qb * B; vector qs(q); unordered_set qv; for (int i = 0; i < q; i++) { int t; cin >> t; if (t == 1) { int u, v; cin >> u >> v; u--, v--; qs[i].type = t, qs[i].u = u, qs[i].v = v; qv.insert(u), qv.insert(v); } else if (t == 2) { int p, a; cin >> p >> a; p--; qs[i].type = t, qs[i].p = p, qs[i].a = a; qv.insert(p); } else { int c; cin >> c; c--; qs[i].type = t, qs[i].c = c; qv.insert(c); } } auto nsum = sum; auto nA = A; for (int i = 0; i < q; i++) { if (qs[i].type == 1) { int u = qs[i].u, v = qs[i].v; if (G[u].count(v)) { G[u].erase(v), G[v].erase(u); nsum[u] -= A[v], nsum[v] -= A[u]; } else { G[u].insert(v), G[v].insert(u); nsum[u] += A[v], nsum[v] += A[u]; } } else if (qs[i].type == 2) { int p = qs[i].p, a = qs[i].a; for (int v : qv) { if (G[p].count(v)) { nsum[v] -= A[p]; nsum[v] += a; } } A[p] = a; } else { int c = qs[i].c; cout << nsum[c] << '\n'; } } for (int i = 0; i < N; i++) { sum[i] = 0; for (int j : G[i]) sum[i] += A[j]; } } }