#include #include #include #include using namespace std; using namespace atcoder; using ll = long long; ll N, M, Q, A[100009], ans[100009]; map mp[100009]; //connect; vector> G, lG; ll query[100009], t[100009], u[100009]; int sqrtM = 300; int main(){ cin >> N >> M; G.resize(N + 1); for(int i = 1; i <= M; i++){ ll a, b; cin >> a >> b; G[a].push_back(b); G[b].push_back(a); mp[a][b] = 1; mp[b][a] = 1; } for(int i = 1; i <= N; i++) cin >> A[i]; lG.resize(N + 1); cin >> Q; for(int q = 1; q <= Q; q++){ cin >> query[q]; if(query[q] == 1){ cin >> t[q] >> u[q]; if(mp[t[q]][u[q]] == 0){ G[t[q]].push_back(u[q]); G[u[q]].push_back(t[q]); mp[t[q]][u[q]] = -1; mp[u[q]][t[q]] = -1; } } if(query[q] == 2){ cin >> t[q] >> u[q]; } if(query[q] == 3){ cin >> t[q]; } } for(int i = 1; i <= N; i++){ for(auto to : G[i]){ if((int)G[to].size() >= sqrtM) lG[i].push_back(to); if((int)G[i].size() >= sqrtM && mp[i][to] == 1) ans[i] += A[to]; } } /*for(int i = 1; i <= N; i++) cout << ans[i] << " "; cout << endl;*/ for(int q = 1; q <= Q; q++){ if(query[q] == 1){ if((int)G[t[q]].size() >= sqrtM){ ans[t[q]] -= A[u[q]] * mp[u[q]][t[q]]; } if((int)G[u[q]].size() >= sqrtM){ ans[u[q]] -= A[t[q]] * mp[t[q]][u[q]]; } mp[u[q]][t[q]] *= -1; mp[t[q]][u[q]] *= -1; } if(query[q] == 2){ for(auto to : lG[t[q]]){ if(mp[t[q]][to] == 1) ans[to] += u[q] - A[t[q]]; //差分 } A[t[q]] = u[q]; } if(query[q] == 3){ if((int)G[t[q]].size() >= sqrtM){ cout << ans[t[q]] << endl; }else{ ll ret = 0; for(auto to : G[t[q]]){ if(mp[t[q]][to] == 1) ret += A[to]; } cout << ret << endl; } } /*for(int i = 1; i <= N; i++) cout << ans[i] << " "; cout << endl;*/ } return 0; }