1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <bits/stdc++.h> #define init(x) memset (x,0,sizeof (x)) #define ll long long #define ull unsigned long long #define INF 0x3f3f3f3f #define pii pair <int,int> using namespace std; const int MAX = 4e5 + 5; const int MOD = 1e9 + 7; inline int read (); pii st[MAX],e[MAX]; vector <pii> ve[MAX << 2]; map <pii,int> mp; int n,q,top,ans[3][MAX],fa[MAX],sz[MAX];char ty[MAX][1]; int getfa (int u); bool merge (int u,int v); void modify (int cur,int l,int r,int x,int y,pii v); void solve (int res[],int cur,int l,int r,int tot); int main () { n = read ();q = read (); for (int i = 1;i <= n;++i) fa[i] = i,sz[i] = 1; for (int i = 1;i <= q;++i) { scanf ("%s",ty[i]);int u = read (),v = read (); if (u > v) swap (u,v); e[i] = {u,v}; } for (int i = 1;i <= q;++i) { if (ty[i][0] == 'B') continue; if (!mp[e[i]]) mp[e[i]] = i; else { modify (1,1,q,mp[e[i]],i - 1,e[i]); mp[e[i]] = 0; } } for (auto item : mp) if (item.second) modify (1,1,q,item.second,q,item.first); solve (ans[1],1,1,q,n); mp.clear (); for (int i = 1;i <= q;++i) { if (ty[i][0] == 'A') continue; if (!mp[e[i]]) mp[e[i]] = i; else { modify (1,1,q,mp[e[i]],i - 1,e[i]); mp[e[i]] = 0; } } for (auto item : mp) if (item.second) modify (1,1,q,item.second,q,item.first); solve (ans[2],1,1,q,n); for (int i = 1;i <= q;++i) printf ("\t%d\n",ans[1][i] - ans[2][i]); return 0; } inline int read () { int s = 0;int f = 1; char ch = getchar (); while ((ch < '0' || ch > '9') && ch != EOF) { if (ch == '-') f = -1; ch = getchar (); } while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar (); } return s * f; } int getfa (int u) {return fa[u] == u ? u : getfa (fa[u]);} bool merge (int u,int v) { u = getfa (u),v = getfa (v); if (u == v) return 0; if (sz[u] > sz[v]) swap (u,v); st[++top] = {u,v}; fa[u] = v;sz[v] += sz[u]; return 1; } void modify (int cur,int l,int r,int x,int y,pii v) { if (x <= l && y >= r) {ve[cur].push_back (v);return ;} int mid = (l + r) >> 1; if (x <= mid) modify (cur << 1,l,mid,x,y,v); if (y > mid) modify (cur << 1 | 1,mid + 1,r,x,y,v); } void solve (int res[],int cur,int l,int r,int tot) { int la = top; for (auto p : ve[cur]) tot -= merge (p.first,p.second); if (l == r) res[l] = tot; else { int mid = (l + r) >> 1; solve (res,cur << 1,l,mid,tot);solve (res,cur << 1 | 1,mid + 1,r,tot); } while (top > la) { sz[st[top].second] -= sz[st[top].first]; fa[st[top].first] = st[top].first; --top; } }
|