// # pragma GCC target("avx2") // # pragma GCC optimize("O3") // # pragma GCC optimize("unroll-loops") #include #include #include #include using namespace std; const int B = 400; typedef long long ll; ll a[100010],ans[100010]; unordered_set um[100010]; ll t[100010],u[100010],v[100010],p[100010],A[100010],C[100010]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int i,j,n,m; cin >> n >> m; for(i=0;i> x >> y; x--; y--; um[x].insert(y); um[y].insert(x); } for(i=0;i> a[i]; int q; cin >> q; int las = -1; auto ope = [&](int x,int y){ if(um[x].count(y)){ um[x].erase(y); um[y].erase(x); }else{ um[x].insert(y); um[y].insert(x); } }; auto calc = [&](){ for(int id=0;id um_t; for(i=0;i> t[i]; if(t[i]==1){ cin >> u[i] >> v[i]; u[i]--; v[i]--; } if(t[i]==2){ cin >> p[i] >> A[i]; p[i]--; um_t.insert(p[i]); } if(t[i]==3){ int V; cin >> V; V--; ll x = ans[V]; // 辺の入れ替え -> 値の更新の順でクエリが来たとする (辺の入れ替えによる差分は全てaで計算して後でCにする) // 値の更新は隣接する頂点だけ見る for(j=las + 1;j