#include<bits/stdc++.h> using namespace std; #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define rep(i,a,b) for(int i=a;i<b;i++) #define rrep(i,a,b) for(int i=a;i>=b;i--) #define fore(i,a) for(auto &i:a) #define all(a) begin(a),end(a) #define allr(a) rbegin(a),rend(a) #define pb push_back #define UNIQUE(x) sort(all(x)), x.erase(unique(all(x)), x.end()) using ll =long long; using pii = pair<int,int>; using pll = pair<ll,ll>; using vi= vector<int>; using vll =vector<ll>; using vvi = vector<vector<int>>; inline bool ingrid(int a,int b,int h,int w){ return 0<=a&&a<h&&0<=b&&b<w; } template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } int popcount(int t){return __builtin_popcount(t);} int popcount(ll t){return __builtin_popcountll(t);} struct Edge{ int from,to;ll cost;int idx; Edge()=default; Edge(int from,int to,ll cost=1,int idx=-1):from(from),to(to),cost(cost),idx(idx){} operator int() const {return to;} }; constexpr pii dx4[4]={{0,1},{0,-1},{1,0},{-1,0}}; constexpr pii dx[100]={}; #define endl '\n' #include<unordered_set> int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n,m;cin>>n>>m; vi x,y;x.resize(m);y.resize(m); vector<unordered_set<int>> g(n); rep(i,0,m){ cin>>x[i]>>y[i]; x[i]--;y[i]--; g[x[i]].insert(y[i]); g[y[i]].insert(x[i]); } vll A(n); rep(i,0,n){ cin>>A[i]; } const int B=400; const int MAXN=100000; int q; cin>>q; int cur[B];//今見ている頂点 bool seen[MAXN]; memset(seen,false,sizeof(seen)); vll ans(n);//差分更新しながら使う const int MAXQ=100000; int x1[MAXQ],x2[MAXQ],x3[MAXQ]; rep(i,0,q){ int t; cin>>t; if(t==1){ int u,v;cin>>u>>v;u--;v--; x1[i]=1;x2[i]=u;x3[i]=v; }else if(t==2){ int p;ll a;cin>>p>>a;p--; x1[i]=2;x2[i]=p;x3[i]=a; }else{ int c;int tmp=-1;cin>>c;c--; x1[i]=3;x2[i]=c;x3[i]=-1; } } int sz=0; rep(i,0,q){ if(i%B==0){ //初期化 rep(j,0,sz){ seen[cur[j]]=0; } int idx=0; rep(j,i,min(q,i+B)){ if(x1[j]==3&&seen[x2[j]]==0){ cur[idx++]=x2[j]; seen[x2[j]]=1; } } sz=idx; rep(_j,0,sz){ int j=cur[_j]; ans[j]=0; fore(k,g[j]){ ans[j]+=A[k]; } } } int t=x1[i],u=x2[i],v=x3[i]; if(t==1){ if(g[u].find(v)!=g[u].end()){ g[u].erase(v); g[v].erase(u); ans[u]-=A[v]; ans[v]-=A[u]; }else{ g[u].insert(v); g[v].insert(u); ans[u]+=A[v]; ans[v]+=A[u]; } }else if(t==2){ int p=u;ll a=v; rep(_j,0,sz){ int j=cur[_j]; if(g[p].find(j)!=g[u].end()){ ans[j]-=A[p]; ans[j]+=v; } } A[p]=v; }else{ cout<<ans[u]<<endl; } } return 0; } /* */