This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;
int N, K, a[240005], b[240005], dsu[120005], rk[120005], aca[240005], acb[240005], ans[240005], cur[120005];
vector<int> Q[120005];
map<int, int> mp[240005];
vector<pii> undo;
char t[240005];
int find(int k)
{
return dsu[k] == k ? k : find(dsu[k]);
}
void merge(int x, int y, int tag = 0)
{
int rx = find(x), ry = find(y);
if(rx == ry)
return;
if(rk[rx] <= rk[ry])
{
dsu[rx] = ry;
rk[ry] += rk[rx];
if(tag)
{
Q[ry].emplace_back(tag);
aca[tag] = rx;
acb[tag] = ry;
}
else
undo.emplace_back(pii(rx, ry));
}
else
{
dsu[ry] = rx;
rk[rx] += rk[ry];
if(tag)
{
Q[rx].emplace_back(tag);
aca[tag] = rx;
acb[tag] = ry;
}
else
undo.emplace_back(pii(ry, rx));
}
}
void rollback(int t)
{
while(undo.size() > t)
{
auto [x, y] = undo.back();
undo.pop_back();
dsu[x] = x;
rk[y] -= rk[x];
}
}
void solve(int k)
{
int sz = undo.size();
while(!Q[k].empty())
{
int i = Q[k].back();
Q[k].pop_back();
if(t[i] == 'S')
{
merge(a[i], b[i]);
solve(aca[i]);
solve(acb[i]);
break;
}
else if(t[i] == 'Q')
ans[i] = (find(a[i]) == find(b[i]));
}
rollback(sz);
}
signed main()
{
cin >> N >> K;
K += N - 1;
for(int i = 1; i <= K; i++)
{
cin >> t[i];
if(t[i] == 'C')
cin >> a[i];
else
cin >> a[i] >> b[i];
}
for(int i = 1; i <= N; i++)
dsu[i] = i, cur[i] = rk[i] = 1;
for(int i = K; i >= 1; i--)
{
if(t[i] == 'S')
{
merge(a[i], b[i], i);
cur[a[i]] += cur[b[i]];
cur[b[i]] = cur[a[i]];
}
else if(t[i] == 'C')
ans[i] = cur[a[i]];
else
{
int r = find(a[i]);
Q[r].emplace_back(i);
}
}
int r = find(1);
for(int i = 1; i <= N; i++)
dsu[i] = i, rk[i] = 1;
solve(r);
for(int i = 1; i <= K; i++)
if(t[i] == 'C')
cout << ans[i] << '\n';
else if(t[i] == 'Q')
cout << (ans[i] ? "yes\n" : "no\n");
}
Compilation message (stderr)
servers.cpp: In function 'void rollback(int)':
servers.cpp:56:20: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
56 | while(undo.size() > t)
| ~~~~~~~~~~~~^~~
servers.cpp:58:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
58 | auto [x, y] = undo.back();
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |