Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define all(X) (X).begin(), (X).end()
- #define pb push_back
- #define rall(X) (X).rbegin(), (X).rend()
- #define ll long long
- #define ull unsigned long long
- #define ld long double
- #define fir first
- #define sec second
- const int nmax = 2e5;
- map<ll, ll> p;
- map<ll, set<ll>> mp;
- void init() {
- for (ll i = 0; i < nmax; i++) {
- p[i] = i;
- }
- }
- ll get(ll a) {
- if (p[a] == a)
- return a;
- else
- return p[a] = get(p[a]);
- }
- void unon(ll a, ll b) {
- for (auto i: mp[b]) {
- mp[a].insert(i);
- }
- mp[b].clear();
- }
- void unit(ll a, ll b) {
- a = get(a);
- b = get(b);
- if (a < b) {
- p[b] = a;
- unon(a, b);
- } else {
- p[a] = b;
- unon(b, a);
- }
- }
- int main() {
- init();
- ll n, m; cin >> n >> m;
- for (ll i = 0; i < m; i++) {
- char q; cin >> q;
- if (q == '+') {
- ll a, b; cin >> a >> b;
- unit(a, b);
- } else if (q == '-') {
- ll a, b; cin >> a >> b;
- a = get(a);
- b = get(b);
- mp[a].insert(b);
- mp[b].insert(a);
- } else {
- ll a, b; cin >> a >> b;
- if (get(a) == get(b))
- cout << "+\n";
- else if (mp[get(a)].find((get(b))) != mp[get(a)].end())
- cout << "-\n";
- else
- cout << "?\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement