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
92
93
94
95
96
97
98
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>
#include <unordered_map>
#include <string>
#include <queue>
#include <deque>
#include <set>
#include <cstdlib>
#include <ctime>
#include<chrono>
#include<thread>
#include<iomanip>
#include<fstream>
#define ll long long
#define pb push_back
#define mp make_pair
#define ff first
#define ss second

using namespace std;

typedef struct mieszkaniec {
    char posiada = '0';
    int drugiMieskaniec = 0;
};
int main()
{
    int n, q;
    cin >> n >> q;
    mieszkaniec listaMieszkancow[n + 1];
    string ans = "";
    while(q--) {
        char polecenie;
        cin >> polecenie;
        switch(polecenie) {
            case '?': {
                int numer = 0;
                cin >> numer;
                ans += listaMieszkancow[numer].posiada;
                break;
            }
            case '+': {
                int numer1 = 0, numer2 = 0;
                cin >> numer1 >> numer2;
                if(numer1 == numer2) {
                    listaMieszkancow[numer1].posiada = '1';
                    listaMieszkancow[numer1].drugiMieskaniec = 0;
                }
                else {
                    if(listaMieszkancow[numer1].posiada == '1') { listaMieszkancow[numer2].posiada = '1';
                        listaMieszkancow[numer2].drugiMieskaniec = 0;
                        listaMieszkancow[listaMieszkancow[numer2].drugiMieskaniec].drugiMieskaniec = 0;
                    }
                    else if(listaMieszkancow[numer2].posiada == '1') {
                        listaMieszkancow[numer1].posiada = '1';
                        listaMieszkancow[numer1].drugiMieskaniec = 0;
                        listaMieszkancow[listaMieszkancow[numer1].drugiMieskaniec].drugiMieskaniec = 0;
                    }
                    else if(listaMieszkancow[numer1].drugiMieskaniec == listaMieszkancow[numer2].drugiMieskaniec && listaMieszkancow[numer1].drugiMieskaniec != 0) {
                        listaMieszkancow[numer1].posiada = '1';
                        listaMieszkancow[numer2].posiada = '1';
                        listaMieszkancow[numer1].drugiMieskaniec = 0;
                        listaMieszkancow[numer2].drugiMieskaniec = 0;
                        listaMieszkancow[listaMieszkancow[numer1].drugiMieskaniec].drugiMieskaniec = 0;
                        listaMieszkancow[listaMieszkancow[numer1].drugiMieskaniec].posiada = '1';
                    }
                    else {
                        listaMieszkancow[numer1].posiada = '?';
                        listaMieszkancow[numer2].posiada = '?';
                        listaMieszkancow[numer1].drugiMieskaniec = numer2;
                        listaMieszkancow[numer2].drugiMieskaniec = numer1;
                    }
                }
                break;
            }
            case '-': {
                int num;
                cin >> num;
                if(listaMieszkancow[num].posiada == '?') {
                    if(listaMieszkancow[listaMieszkancow[num].drugiMieskaniec].posiada == '?') {
                        listaMieszkancow[listaMieszkancow[num].drugiMieskaniec].posiada = '1';
                        listaMieszkancow[listaMieszkancow[num].drugiMieskaniec].drugiMieskaniec = 0;
                        listaMieszkancow[num].drugiMieskaniec= 0;
                        listaMieszkancow[num].posiada = '0';
                    }
                    else listaMieszkancow[num].posiada = '0';
                }
                else listaMieszkancow[num]. posiada = '0';
                break;
            }
        }
    }
    cout << ans << endl;
    return 0;
}