#include <cstdio>
#include <vector>
#include <algorithm>
#define REP(a, n) for (int a = 0; a < (n); ++a)
using namespace std;
//////////////////////
#define ILE 300001
int N, Q;
vector<int> wolne;
int num[ILE], poprz[ILE], nast[ILE];
int rozm[ILE], silna[ILE];
void polacz(int a, int b) {
    if (num[a] == num[b]) {
        silna[num[a]] = 1;
        return;
    }
    if (rozm[num[a]] > rozm[num[b]])
        swap(a, b);
    if (silna[num[a]])
        silna[num[b]] = 1;
    rozm[num[b]] += rozm[num[a]];
    swap(nast[a], nast[b]);
    swap(poprz[nast[a]], poprz[nast[b]]);
    wolne.push_back(num[a]);
    for (int c = nast[b]; num[c] != num[b]; c = nast[c])
        num[c] = num[b];
}
void usun(int a) {
    if (rozm[num[a]] > 1) {
        nast[poprz[a]] = nast[a];
        poprz[nast[a]] = poprz[a];
        --rozm[num[a]];
        int x = wolne.back();
        wolne.pop_back();
        num[a] = x;
        poprz[a] = nast[a] = a;
        silna[x] = 0;
        rozm[x] = 1;
    }
    else {
        silna[num[a]] = 0;
    }
}
int main() {
    scanf("%d%d", &N, &Q);
    REP(a, N) {
        rozm[a] = 1;
        num[a] = poprz[a] = nast[a] = a;
    }
    REP(q, Q) {
        char ch;
        int a, b;
        scanf(" %c%d", &ch, &a);
        --a;
        if (ch == '+') {
            scanf("%d", &b);
            --b;
            polacz(a, b);
        }
        else
        if (ch == '-') {
            usun(a);
        }
        else {
            printf("%c", silna[num[a]] ? '1' : rozm[num[a]] > 1 ? '?' : '0');
        }
    }
    printf("\n");
}
        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  | #include <cstdio> #include <vector> #include <algorithm> #define REP(a, n) for (int a = 0; a < (n); ++a) using namespace std; ////////////////////// #define ILE 300001 int N, Q; vector<int> wolne; int num[ILE], poprz[ILE], nast[ILE]; int rozm[ILE], silna[ILE]; void polacz(int a, int b) { if (num[a] == num[b]) { silna[num[a]] = 1; return; } if (rozm[num[a]] > rozm[num[b]]) swap(a, b); if (silna[num[a]]) silna[num[b]] = 1; rozm[num[b]] += rozm[num[a]]; swap(nast[a], nast[b]); swap(poprz[nast[a]], poprz[nast[b]]); wolne.push_back(num[a]); for (int c = nast[b]; num[c] != num[b]; c = nast[c]) num[c] = num[b]; } void usun(int a) { if (rozm[num[a]] > 1) { nast[poprz[a]] = nast[a]; poprz[nast[a]] = poprz[a]; --rozm[num[a]]; int x = wolne.back(); wolne.pop_back(); num[a] = x; poprz[a] = nast[a] = a; silna[x] = 0; rozm[x] = 1; } else { silna[num[a]] = 0; } } int main() { scanf("%d%d", &N, &Q); REP(a, N) { rozm[a] = 1; num[a] = poprz[a] = nast[a] = a; } REP(q, Q) { char ch; int a, b; scanf(" %c%d", &ch, &a); --a; if (ch == '+') { scanf("%d", &b); --b; polacz(a, b); } else if (ch == '-') { usun(a); } else { printf("%c", silna[num[a]] ? '1' : rozm[num[a]] > 1 ? '?' : '0'); } } printf("\n"); }  | 
            
        
                    English