#include <bits/stdc++.h>
using namespace std;
const int maxN=3e5+10;
int n, q, in1, in2;
char type;
int grupa[maxN];
int rep[maxN*8], akt_grupa=1, sizee[maxN*8];
bool czy_one[maxN*8];
int Find(int x)
{
    x=grupa[x];
    if(x!=rep[x])
        rep[x]=Find(x);
    return rep[x];
}
void Union(int x, int y)
{
    int x_pom=Find(x);
    int y_pom=Find(y);
    if(x_pom==0)
    {
        grupa[x]=akt_grupa;
        x_pom=akt_grupa;
        sizee[akt_grupa]=1;
        rep[akt_grupa]=akt_grupa;
        akt_grupa++;
        y_pom=Find(y);
    }
    if(y_pom==0)
    {
        grupa[y]=akt_grupa;
        y_pom=akt_grupa;
        sizee[akt_grupa]=1;
        rep[akt_grupa]=akt_grupa;
        akt_grupa++;
    }
    if(y_pom==x_pom)
    {
        czy_one[x_pom]=1;
        return;
    } 
    if(sizee[x_pom]<sizee[y_pom]){ swap(x_pom, y_pom); swap(x, y);}
    sizee[x_pom]+=sizee[y_pom];
    grupa[y]=grupa[x];
    rep[y_pom]=rep[x_pom];
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>q;
    while(q--)
    {
        cin>>type;
        if(type=='+')
        {
            cin>>in1>>in2;
            Union(in1, in2);
        }
        if(type=='-')
        {
            cin>>in1;
            grupa[in1]=0;
        }
        if(type=='?')
        {
            cin>>in1;
            if(Find(in1)==0) cout<<0;
            else if(czy_one[Find(in1)]) cout<<1;
            else cout<<"?";
        }
    }
}
        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  | #include <bits/stdc++.h> using namespace std; const int maxN=3e5+10; int n, q, in1, in2; char type; int grupa[maxN]; int rep[maxN*8], akt_grupa=1, sizee[maxN*8]; bool czy_one[maxN*8]; int Find(int x) { x=grupa[x]; if(x!=rep[x]) rep[x]=Find(x); return rep[x]; } void Union(int x, int y) { int x_pom=Find(x); int y_pom=Find(y); if(x_pom==0) { grupa[x]=akt_grupa; x_pom=akt_grupa; sizee[akt_grupa]=1; rep[akt_grupa]=akt_grupa; akt_grupa++; y_pom=Find(y); } if(y_pom==0) { grupa[y]=akt_grupa; y_pom=akt_grupa; sizee[akt_grupa]=1; rep[akt_grupa]=akt_grupa; akt_grupa++; } if(y_pom==x_pom) { czy_one[x_pom]=1; return; } if(sizee[x_pom]<sizee[y_pom]){ swap(x_pom, y_pom); swap(x, y);} sizee[x_pom]+=sizee[y_pom]; grupa[y]=grupa[x]; rep[y_pom]=rep[x_pom]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; while(q--) { cin>>type; if(type=='+') { cin>>in1>>in2; Union(in1, in2); } if(type=='-') { cin>>in1; grupa[in1]=0; } if(type=='?') { cin>>in1; if(Find(in1)==0) cout<<0; else if(czy_one[Find(in1)]) cout<<1; else cout<<"?"; } } }  | 
            
        
                    English