Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- bool ans[100005];
- int t[100005],a[100005],b[100005];
- map<pair<int,int>,int> m;
- vector<pair<int,int> > tree[400005],u;
- vector<int> par[100005],sz[100005];
- void update(int node,int st,int en,int l,int r,pair<int,int> e)
- {
- if (l<=st && en<=r)
- tree[node].push_back(e);
- if (en<l || st>r || r<l || (l<=st && en<=r))
- return;
- int mid=(st+en)/2;
- update(2*node,st,mid,l,r,e);
- update(2*node+1,mid+1,en,l,r,e);
- }
- int find(int x)
- {
- if (par[x].back()==x)
- return x;
- return find(par[x].back());
- }
- void Union(int x,int y)
- {
- x=find(x);
- y=find(y);
- if (x==y)
- return;
- if (sz[x].back()>sz[y].back())
- swap(x,y);
- par[x].push_back(y);
- sz[y].push_back(sz[x].back()+sz[y].back());
- u.push_back({x,y});
- }
- void solve(int node,int st,int en)
- {
- int curt=u.size();
- for (auto e:tree[node])
- Union(e.first,e.second);
- if (st==en)
- {
- if (t[st]==2)
- ans[st]=(find(a[st])==find(b[st]));
- return;
- }
- int mid=(st+en)/2;
- solve(2*node,st,mid);
- solve(2*node+1,mid+1,en);
- while (u.size()!=curt)
- {
- par[u.back().first].pop_back();
- sz[u.back().second].pop_back();
- u.pop_back();
- }
- }
- int main()
- {
- int n,q;
- cin >> n >> q;
- for (int i=1;i<=n;i++)
- {
- par[i].push_back(i);
- sz[i].push_back(1);
- }
- for (int i=1;i<=q;i++)
- {
- string s;
- cin >> s >> a[i] >> b[i];
- if (a[i]>b[i])
- swap(a[i],b[i]);
- if (s=="add")
- m[{a[i],b[i]}]=i;
- else if (s=="rem")
- {
- t[i]=1;
- update(1,1,q,m[{a[i],b[i]}],i,{a[i],b[i]});
- m[{a[i],b[i]}]=0;
- }
- else
- t[i]=2;
- }
- for (auto p:m)
- {
- if (p.second)
- update(1,1,q,p.second,q,p.first);
- }
- solve(1,1,q);
- for (int i=1;i<=q;i++)
- {
- if (t[i]==2)
- puts(ans[i]? "YES":"NO");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement