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
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=2e6+7;
vector<int>V[LIM];
int F[LIM], czy[LIM], kto[LIM], ile[LIM], n;
int fnd(int x) {
  if(F[x]==x) return x;
  return F[x]=fnd(F[x]);
}
void wlacz(int x) {
  x=fnd(x);
  vector<int>P=V[x];
  for(auto i : P) {
    V[i].clear();
    V[i].pb(i);
    F[i]=i;
    czy[i]=1;
  }
}
void wylacz(int x) {
  kto[x]=n;
  F[n]=n;
  V[n].pb(n);
  ile[n]=1;
  ++n;
}
void uni(int a, int b) {
  a=fnd(a); b=fnd(b);
  if(V[a].size()<V[b].size()) swap(a, b);
  for(auto i : V[b]) V[a].pb(i);
  V[b].clear();
  ile[a]+=ile[b];
  F[b]=a;
}
void lacz(int a, int b) {
  if(czy[a]) {
    if(!czy[b]) wlacz(b);
    return;
  }
  if(czy[b]) {
    if(!czy[a]) wlacz(a);
    return;
  }
  if(fnd(a)==fnd(b)) wlacz(a);
  else uni(a, b);
}
int main() {
  ios_base::sync_with_stdio(0); cin.tie(0);
  int q;
  cin >> n >> q;
  rep(i, n) {
    F[i]=i;
    kto[i]=i;
    ile[i]=1;
    V[i].pb(i);
  }
  while(q--) {
    char t;
    cin >> t;
    if(t=='+') {
      int a, b;
      cin >> a >> b; --a; --b;
      a=kto[a];
      b=kto[b];
      lacz(a, b);
    } else if(t=='-') {
      int a;
      cin >> a; --a;
      --ile[fnd(kto[a])];
      wylacz(a);
    } else {
      int a;
      cin >> a; --a;
      a=kto[a];
      if(czy[a]) {
        cout << 1;
        continue;
      }
      cout << (ile[fnd(a)]>1?"?":"0");
    }
  }
  cout << '\n';
}