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
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>

#define P(a,n) for(int j=a;j<n;j++)
#define P3(a,n,z) for(int z=a;z<n;z++)
#define PD(pocz,kon,z) for(int z=pocz;z>=kon;z--)
#define W while

#define PB push_back
#define F first
#define S second
#define ll long long

#define O cout<<
#define I cin>>
#define endl '\n'
#define E '\n'

/**Worst case time complexity O(nlogn+q) */



using namespace std;
constexpr int MN=300'005;
int nalezy[MN];
int war[MN];
int il[MN];
vector<int>dogr[MN];
vector<int>wolne;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(NULL);
int n,k,a,b;
char c;
I n>>k;
P(1,n+1)
{ dogr[j].PB(j);il[j]++; nalezy[j]=j;}
P(n+2, 2*n+2)
wolne.PB(j);
P(0,k)
{
    I c;
    if(c=='+')
      {
          I a>>b;
          if(nalezy[a]==nalezy[b])
          {war[nalezy[a]]=1;}
          else{
          if(il[nalezy[a]]<il[nalezy[b]])
            swap(a,b);
            int do_usun=nalezy[b];
            if(war[do_usun]==1)
                war[nalezy[a]]=1;
            for(int x:dogr[nalezy[b]])
            {
                if(nalezy[x]!=do_usun) continue;
                nalezy[x]=nalezy[a];
                dogr[nalezy[a]].PB(x);
            }
            il[nalezy[a]]+=il[do_usun];
            wolne.PB(do_usun);
          }
      }
    else if(c=='-')
    {
        I a;
        il[nalezy[a]]--;
        if(il[nalezy[a]]==0) { wolne.PB(nalezy[a]);}
        nalezy[a]=wolne.back();wolne.pop_back();
        war[nalezy[a]]=0; il[nalezy[a]]=1; dogr[nalezy[a]].clear();dogr[nalezy[a]].PB(a);
    }

    else
    {
        I a;
        if(war[nalezy[a]]==1) O 1;
       else if(il[nalezy[a]]==1) O 0;
        else O '?';
       // O E;
    }
   /* P(1,n+1)
    O nalezy[j]<<' '<<il[nalezy[j]]<<' '<<war[nalezy[j]]<<"; ";
    O E;*/
}



return 0;
}